blob: cee167c345f461eaa060b4cb38119dc3a9eba949 [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 Rossumc6472e91997-03-31 17:15:43 +000052static object *int_from_string PROTO((object *));
53static object *long_from_string PROTO((object *));
54static object *float_from_string PROTO((object *));
Guido van Rossum12d12c51993-10-26 17:58:25 +000055
Guido van Rossum3f5da241990-12-20 15:06:42 +000056static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +000057builtin___import__(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +000058 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000059 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +000060{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000061 char *name;
Guido van Rossum24c13741995-02-14 09:42:43 +000062 object *globals = NULL;
63 object *locals = NULL;
64 object *fromlist = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000065
Guido van Rossum24c13741995-02-14 09:42:43 +000066 if (!newgetargs(args, "s|OOO:__import__",
67 &name, &globals, &locals, &fromlist))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000068 return NULL;
Guido van Rossum7f9fa971995-01-20 16:53:12 +000069 return import_module(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000070}
71
72
73static object *
74builtin_abs(self, args)
75 object *self;
76 object *args;
77{
78 object *v;
Guido van Rossumd4905451991-05-05 20:00:36 +000079 number_methods *nm;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000080
81 if (!newgetargs(args, "O:abs", &v))
82 return NULL;
83 if ((nm = v->ob_type->tp_as_number) == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +000084 err_setstr(TypeError, "abs() requires numeric argument");
85 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000086 }
Guido van Rossumd4905451991-05-05 20:00:36 +000087 return (*nm->nb_absolute)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000088}
89
90static object *
Guido van Rossum94390a41992-08-14 15:14:30 +000091builtin_apply(self, args)
Guido van Rossumc02e15c1991-12-16 13:03:00 +000092 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +000093 object *args;
Guido van Rossumc02e15c1991-12-16 13:03:00 +000094{
Guido van Rossumc96ef6a1996-01-26 20:44:30 +000095 object *func, *alist = NULL, *kwdict = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000096
Guido van Rossum681d79a1995-07-18 14:51:37 +000097 if (!newgetargs(args, "O|OO:apply", &func, &alist, &kwdict))
Guido van Rossumc02e15c1991-12-16 13:03:00 +000098 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +000099 if (alist != NULL && !is_tupleobject(alist)) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000100 err_setstr(TypeError, "apply() 2nd argument must be tuple");
101 return NULL;
102 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000103 if (kwdict != NULL && !is_dictobject(kwdict)) {
104 err_setstr(TypeError,
105 "apply() 3rd argument must be dictionary");
106 return NULL;
107 }
108 return PyEval_CallObjectWithKeywords(func, alist, kwdict);
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000109}
110
Guido van Rossum2d951851994-08-29 12:52:16 +0000111static object *
112builtin_callable(self, args)
113 object *self;
114 object *args;
115{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000116 object *v;
117
118 if (!newgetargs(args, "O:callable", &v))
Guido van Rossum2d951851994-08-29 12:52:16 +0000119 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000120 return newintobject((long)callable(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000121}
122
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000123static object *
Guido van Rossume77a7571993-11-03 15:01:26 +0000124builtin_filter(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000125 object *self;
126 object *args;
127{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000128 object *func, *seq, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000129 sequence_methods *sqf;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000130 int len;
131 register int i, j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000132
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000133 if (!newgetargs(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000134 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000135
Guido van Rossum12d12c51993-10-26 17:58:25 +0000136 if (is_stringobject(seq)) {
137 object *r = filterstring(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000138 return r;
139 }
140
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000141 if (is_tupleobject(seq)) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000142 object *r = filtertuple(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000143 return r;
144 }
145
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000146 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000147 err_setstr(TypeError,
Guido van Rossume77a7571993-11-03 15:01:26 +0000148 "argument 2 to filter() must be a sequence type");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000149 goto Fail_2;
150 }
151
152 if ((len = (*sqf->sq_length)(seq)) < 0)
153 goto Fail_2;
154
155 if (is_listobject(seq) && seq->ob_refcnt == 1) {
156 INCREF(seq);
157 result = seq;
158 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000159 else {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000160 if ((result = newlistobject(len)) == NULL)
161 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000162 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000163
Guido van Rossum2d951851994-08-29 12:52:16 +0000164 for (i = j = 0; ; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000165 object *item, *good;
166 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000167
Guido van Rossum2d951851994-08-29 12:52:16 +0000168 if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
169 if (i < len)
170 goto Fail_1;
171 if (err_occurred() == IndexError) {
172 err_clear();
173 break;
174 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000175 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000176 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000177
178 if (func == None) {
179 good = item;
Guido van Rossum58b68731995-01-10 17:40:55 +0000180 INCREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000181 }
182 else {
183 object *arg = mkvalue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000184 if (arg == NULL)
185 goto Fail_1;
186 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000187 DECREF(arg);
Guido van Rossum58b68731995-01-10 17:40:55 +0000188 if (good == NULL) {
189 DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000190 goto Fail_1;
Guido van Rossum58b68731995-01-10 17:40:55 +0000191 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000192 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000193 ok = testbool(good);
194 DECREF(good);
195 if (ok) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000196 if (j < len) {
197 if (setlistitem(result, j++, item) < 0)
198 goto Fail_1;
199 }
200 else {
201 j++;
202 if (addlistitem(result, item) < 0)
203 goto Fail_1;
204 }
Guido van Rossum58b68731995-01-10 17:40:55 +0000205 } else {
206 DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000207 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000208 }
209
Guido van Rossum12d12c51993-10-26 17:58:25 +0000210
Guido van Rossum2d951851994-08-29 12:52:16 +0000211 if (j < len && setlistslice(result, j, len, NULL) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000212 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000213
Guido van Rossum12d12c51993-10-26 17:58:25 +0000214 return result;
215
Guido van Rossum12d12c51993-10-26 17:58:25 +0000216Fail_1:
217 DECREF(result);
218Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000219 return NULL;
220}
221
222static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000223builtin_chr(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000224 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000225 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000226{
227 long x;
228 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000229
230 if (!newgetargs(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000231 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000232 if (x < 0 || x >= 256) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000233 err_setstr(ValueError, "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000234 return NULL;
235 }
236 s[0] = x;
237 return newsizedstringobject(s, 1);
238}
239
240static object *
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000241builtin_cmp(self, args)
242 object *self;
243 object *args;
244{
245 object *a, *b;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000246
247 if (!newgetargs(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000248 return NULL;
249 return newintobject((long)cmpobject(a, b));
250}
251
252static object *
Guido van Rossum5524a591995-01-10 15:26:20 +0000253builtin_coerce(self, args)
254 object *self;
255 object *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000256{
Guido van Rossum5524a591995-01-10 15:26:20 +0000257 object *v, *w;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000258 object *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000259
260 if (!newgetargs(args, "OO:coerce", &v, &w))
261 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000262 if (coerce(&v, &w) < 0)
263 return NULL;
264 res = mkvalue("(OO)", v, w);
265 DECREF(v);
266 DECREF(w);
267 return res;
268}
269
270static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000271builtin_compile(self, args)
272 object *self;
273 object *args;
274{
275 char *str;
276 char *filename;
277 char *startstr;
278 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000279
280 if (!newgetargs(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000281 return NULL;
282 if (strcmp(startstr, "exec") == 0)
283 start = file_input;
284 else if (strcmp(startstr, "eval") == 0)
285 start = eval_input;
Guido van Rossum872537c1995-07-07 22:43:42 +0000286 else if (strcmp(startstr, "single") == 0)
287 start = single_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000288 else {
289 err_setstr(ValueError,
Guido van Rossum872537c1995-07-07 22:43:42 +0000290 "compile() mode must be 'exec' or 'eval' or 'single'");
Guido van Rossum5b722181993-03-30 17:46:03 +0000291 return NULL;
292 }
293 return compile_string(str, filename, start);
294}
295
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000296#ifndef WITHOUT_COMPLEX
297
298static object *
299builtin_complex(self, args)
300 object *self;
301 object *args;
302{
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000303 object *r, *i, *tmp;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000304 number_methods *nbr, *nbi;
Guido van Rossum530956d1996-07-21 02:27:43 +0000305 Py_complex cr, ci;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000306 int own_r = 0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000307
308 i = NULL;
309 if (!newgetargs(args, "O|O:complex", &r, &i))
310 return NULL;
311 if ((nbr = r->ob_type->tp_as_number) == NULL ||
Guido van Rossumc6472e91997-03-31 17:15:43 +0000312 nbr->nb_float == NULL ||
313 (i != NULL &&
314 ((nbi = i->ob_type->tp_as_number) == NULL ||
315 nbi->nb_float == NULL))) {
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000316 err_setstr(TypeError,
317 "complex() argument can't be converted to complex");
318 return NULL;
319 }
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000320 /* XXX Hack to support classes with __complex__ method */
321 if (is_instanceobject(r)) {
322 static object *complexstr;
323 object *f;
324 if (complexstr == NULL) {
Guido van Rossum8d751611997-01-18 08:04:16 +0000325 complexstr = PyString_InternFromString("__complex__");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000326 if (complexstr == NULL)
327 return NULL;
328 }
329 f = getattro(r, complexstr);
330 if (f == NULL)
331 err_clear();
332 else {
333 object *args = mkvalue("()");
334 if (args == NULL)
335 return NULL;
336 r = call_object(f, args);
337 DECREF(args);
338 if (r == NULL)
339 return NULL;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000340 own_r = 1;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000341 }
342 }
Guido van Rossumc6472e91997-03-31 17:15:43 +0000343 if (is_complexobject(r)) {
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000344 cr = ((complexobject*)r)->cval;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000345 if (own_r)
346 DECREF(r);
347 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000348 else {
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000349 tmp = (*nbr->nb_float)(r);
Guido van Rossumc6472e91997-03-31 17:15:43 +0000350 if (own_r)
351 DECREF(r);
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000352 if (tmp == NULL)
353 return NULL;
354 cr.real = getfloatvalue(tmp);
355 DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000356 cr.imag = 0.;
357 }
358 if (i == NULL) {
359 ci.real = 0.;
360 ci.imag = 0.;
361 }
362 else if (is_complexobject(i))
363 ci = ((complexobject*)i)->cval;
364 else {
Guido van Rossumc6472e91997-03-31 17:15:43 +0000365 tmp = (*nbi->nb_float)(i);
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000366 if (tmp == NULL)
367 return NULL;
368 ci.real = getfloatvalue(tmp);
369 DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000370 ci.imag = 0.;
371 }
372 cr.real -= ci.imag;
373 cr.imag += ci.real;
374 return newcomplexobject(cr);
375}
376
377#endif
378
Guido van Rossum5b722181993-03-30 17:46:03 +0000379static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000380builtin_dir(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000381 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000382 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000383{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000384 object *v = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000385 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000386
387 if (!newgetargs(args, "|O:dir", &v))
388 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000389 if (v == NULL) {
390 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000391 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000392 }
393 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000394 d = getattr(v, "__dict__");
395 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000396 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000397 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000398 return NULL;
399 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000400 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000401 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000402 v = getdictkeys(d);
403 if (sortlist(v) != 0) {
404 DECREF(v);
405 v = NULL;
406 }
407 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000408 else {
Guido van Rossum795ba581996-05-23 22:49:07 +0000409 v = PyObject_CallMethod(d, "keys", NULL);
410 if (v == NULL) {
411 PyErr_Clear();
412 v = newlistobject(0);
413 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000414 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000415 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000416 return v;
417}
418
419static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000420do_divmod(v, w)
421 object *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000422{
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000423 object *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000424
Guido van Rossum180d7b41994-09-29 09:45:57 +0000425 if (is_instanceobject(v) || is_instanceobject(w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000426 return instancebinop(v, w, "__divmod__", "__rdivmod__",
427 do_divmod);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000428 if (v->ob_type->tp_as_number == NULL ||
429 w->ob_type->tp_as_number == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000430 err_setstr(TypeError,
431 "divmod() requires numeric or class instance arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000432 return NULL;
433 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000434 if (coerce(&v, &w) != 0)
435 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000436 res = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000437 DECREF(v);
438 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000439 return res;
440}
441
442static object *
443builtin_divmod(self, args)
444 object *self;
445 object *args;
446{
447 object *v, *w;
448
449 if (!newgetargs(args, "OO:divmod", &v, &w))
450 return NULL;
451 return do_divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000452}
453
454static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000455builtin_eval(self, args)
456 object *self;
457 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000458{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000459 object *cmd;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000460 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000461 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000462
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000463 if (!newgetargs(args, "O|O!O!:eval",
464 &cmd,
465 &Mappingtype, &globals,
466 &Mappingtype, &locals))
467 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000468 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000469 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000470 if (locals == None)
471 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000472 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000473 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000474 locals = globals;
475 if (dictlookup(globals, "__builtins__") == NULL) {
476 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
477 return NULL;
478 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000479 if (is_codeobject(cmd))
Guido van Rossum681d79a1995-07-18 14:51:37 +0000480 return eval_code((codeobject *) cmd, globals, locals);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000481 if (!is_stringobject(cmd)) {
482 err_setstr(TypeError,
483 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000484 return NULL;
485 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000486 str = getstringvalue(cmd);
487 if (strlen(str) != getstringsize(cmd)) {
488 err_setstr(ValueError,
489 "embedded '\\0' in string arg");
490 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000491 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000492 while (*str == ' ' || *str == '\t')
493 str++;
494 return run_string(str, eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000495}
496
497static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000498builtin_execfile(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000499 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000500 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000501{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000502 char *filename;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000503 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000504 object *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000505 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000506
507 if (!newgetargs(args, "s|O!O!:execfile",
508 &filename,
509 &Mappingtype, &globals,
510 &Mappingtype, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000511 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000512 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000513 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000514 if (locals == None)
515 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000516 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000517 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000518 locals = globals;
519 if (dictlookup(globals, "__builtins__") == NULL) {
520 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
521 return NULL;
522 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000523 BGN_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000524 fp = fopen(filename, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000525 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000526 if (fp == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000527 err_errno(IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000528 return NULL;
529 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000530 res = run_file(fp, filename, file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000531 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000532 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000533 END_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000534 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000535}
536
537static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000538builtin_float(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000539 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000540 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000541{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000542 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000543 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000544
545 if (!newgetargs(args, "O:float", &v))
546 return NULL;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000547 if (is_stringobject(v))
548 return float_from_string(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000549 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000550 nb->nb_float == NULL) {
551 err_setstr(TypeError,
552 "float() argument can't be converted to float");
553 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000554 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000555 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000556}
557
558static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000559builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000560 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000561 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000562{
Guido van Rossum94390a41992-08-14 15:14:30 +0000563 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000564 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000565
566 if (!newgetargs(args, "OS:getattr", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000567 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000568 return getattro(v, name);
569}
570
571static object *
Guido van Rossum872537c1995-07-07 22:43:42 +0000572builtin_globals(self, args)
573 object *self;
574 object *args;
575{
576 object *d;
577
578 if (!newgetargs(args, ""))
579 return NULL;
580 d = getglobals();
581 INCREF(d);
582 return d;
583}
584
585static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000586builtin_hasattr(self, args)
587 object *self;
588 object *args;
589{
590 object *v;
591 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000592
593 if (!newgetargs(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000594 return NULL;
595 v = getattro(v, name);
596 if (v == NULL) {
597 err_clear();
598 return newintobject(0L);
599 }
600 DECREF(v);
601 return newintobject(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000602}
603
604static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000605builtin_id(self, args)
606 object *self;
607 object *args;
608{
609 object *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000610
611 if (!newgetargs(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000612 return NULL;
613 return newintobject((long)v);
614}
615
616static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000617builtin_map(self, args)
618 object *self;
619 object *args;
620{
621 typedef struct {
622 object *seq;
623 sequence_methods *sqf;
624 int len;
625 } sequence;
626
627 object *func, *result;
628 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000629 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000630 register int i, j;
631
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000632 n = gettuplesize(args);
633 if (n < 2) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000634 err_setstr(TypeError, "map() requires at least two args");
635 return NULL;
636 }
637
638 func = gettupleitem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000639 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000640
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000641 if ((seqs = NEW(sequence, n)) == NULL) {
642 err_nomem();
643 goto Fail_2;
644 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000645
Guido van Rossum2d951851994-08-29 12:52:16 +0000646 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000647 int curlen;
648
649 if ((sqp->seq = gettupleitem(args, i + 1)) == NULL)
650 goto Fail_2;
651
652 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
653 static char errmsg[] =
654 "argument %d to map() must be a sequence object";
655 char errbuf[sizeof(errmsg) + 3];
656
657 sprintf(errbuf, errmsg, i+2);
658 err_setstr(TypeError, errbuf);
659 goto Fail_2;
660 }
661
662 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
663 goto Fail_2;
664
665 if (curlen > len)
666 len = curlen;
667 }
668
669 if ((result = (object *) newlistobject(len)) == NULL)
670 goto Fail_2;
671
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000672 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum2d951851994-08-29 12:52:16 +0000673 for (i = 0; ; ++i) {
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000674 object *alist, *item=NULL, *value;
Guido van Rossum2d951851994-08-29 12:52:16 +0000675 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000676
Guido van Rossum2d951851994-08-29 12:52:16 +0000677 if (func == None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +0000678 alist = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000679 else {
Guido van Rossum32120311995-07-10 13:52:21 +0000680 if ((alist = newtupleobject(n)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +0000681 goto Fail_1;
682 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000683
684 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000685 if (sqp->len < 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000686 INCREF(None);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000687 item = None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000688 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000689 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000690 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000691 if (item == NULL) {
692 if (i < sqp->len)
693 goto Fail_0;
694 if (err_occurred() == IndexError) {
695 err_clear();
696 INCREF(None);
697 item = None;
698 sqp->len = -1;
699 }
700 else {
701 goto Fail_0;
702 }
703 }
704 else
705 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000706
Guido van Rossum12d12c51993-10-26 17:58:25 +0000707 }
Guido van Rossum32120311995-07-10 13:52:21 +0000708 if (!alist)
Guido van Rossum2d951851994-08-29 12:52:16 +0000709 break;
Guido van Rossum32120311995-07-10 13:52:21 +0000710 if (settupleitem(alist, j, item) < 0) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000711 DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000712 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +0000713 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000714 continue;
715
716 Fail_0:
Guido van Rossum32120311995-07-10 13:52:21 +0000717 XDECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000718 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000719 }
720
Guido van Rossum32120311995-07-10 13:52:21 +0000721 if (!alist)
722 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +0000723
724 if (!any) {
Guido van Rossum32120311995-07-10 13:52:21 +0000725 DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +0000726 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000727 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000728
729 if (func == None)
Guido van Rossum32120311995-07-10 13:52:21 +0000730 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000731 else {
Guido van Rossum32120311995-07-10 13:52:21 +0000732 value = call_object(func, alist);
733 DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000734 if (value == NULL)
735 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000736 }
737 if (i >= len) {
738 if (addlistitem(result, value) < 0)
739 goto Fail_1;
740 }
741 else {
742 if (setlistitem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000743 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000744 }
745 }
746
Guido van Rossum2d951851994-08-29 12:52:16 +0000747 DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000748 return result;
749
Guido van Rossum12d12c51993-10-26 17:58:25 +0000750Fail_1:
751 DECREF(result);
752Fail_2:
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000753 if (seqs) DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000754 return NULL;
755}
756
757static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000758builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000759 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000760 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000761{
Guido van Rossum94390a41992-08-14 15:14:30 +0000762 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000763 object *name;
Guido van Rossum94390a41992-08-14 15:14:30 +0000764 object *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000765
766 if (!newgetargs(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000767 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000768 if (setattro(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000769 return NULL;
770 INCREF(None);
771 return None;
772}
773
774static object *
Guido van Rossum14144fc1994-08-29 12:53:40 +0000775builtin_delattr(self, args)
776 object *self;
777 object *args;
778{
779 object *v;
780 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000781
782 if (!newgetargs(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000783 return NULL;
784 if (setattro(v, name, (object *)NULL) != 0)
785 return NULL;
786 INCREF(None);
787 return None;
788}
789
790static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000791builtin_hash(self, args)
792 object *self;
793 object *args;
794{
795 object *v;
796 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000797
798 if (!newgetargs(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000799 return NULL;
800 x = hashobject(v);
801 if (x == -1)
802 return NULL;
803 return newintobject(x);
804}
805
806static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000807builtin_hex(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000808 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000809 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000810{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000811 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000812 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000813
814 if (!newgetargs(args, "O:hex", &v))
815 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000816
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000817 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000818 nb->nb_hex == NULL) {
819 err_setstr(TypeError,
820 "hex() argument can't be converted to hex");
821 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000822 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000823 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000824}
825
Guido van Rossum3165fe61992-09-25 21:59:05 +0000826static object *builtin_raw_input PROTO((object *, object *));
827
Guido van Rossum006bcd41991-10-24 14:54:44 +0000828static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000829builtin_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000830 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000831 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000832{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000833 object *line;
834 char *str;
835 object *res;
Guido van Rossum6135a871995-01-09 17:53:26 +0000836 object *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000837
838 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000839 if (line == NULL)
840 return line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000841 if (!getargs(line, "s;embedded '\\0' in input line", &str))
842 return NULL;
843 while (*str == ' ' || *str == '\t')
844 str++;
Guido van Rossum6135a871995-01-09 17:53:26 +0000845 globals = getglobals();
846 locals = getlocals();
847 if (dictlookup(globals, "__builtins__") == NULL) {
848 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
849 return NULL;
850 }
851 res = run_string(str, eval_input, globals, locals);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000852 DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000853 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000854}
855
Guido van Rossume8811f81997-02-14 15:48:05 +0000856static PyObject *
857builtin_intern(self, args)
858 PyObject *self;
859 PyObject *args;
860{
861 PyObject *s;
862 if (!PyArg_ParseTuple(args, "S", &s))
863 return NULL;
864 Py_INCREF(s);
865 PyString_InternInPlace(&s);
866 return s;
867}
868
Guido van Rossum3f5da241990-12-20 15:06:42 +0000869static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000870builtin_int(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000871 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000872 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000873{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000874 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000875 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000876
877 if (!newgetargs(args, "O:int", &v))
878 return NULL;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000879 if (is_stringobject(v))
880 return int_from_string(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000881 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000882 nb->nb_int == NULL) {
883 err_setstr(TypeError,
884 "int() argument can't be converted to int");
885 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000886 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000887 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000888}
889
890static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000891builtin_len(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000892 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000893 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000894{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000895 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000896 long len;
897 typeobject *tp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000898
899 if (!newgetargs(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000900 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000901 tp = v->ob_type;
902 if (tp->tp_as_sequence != NULL) {
903 len = (*tp->tp_as_sequence->sq_length)(v);
904 }
905 else if (tp->tp_as_mapping != NULL) {
906 len = (*tp->tp_as_mapping->mp_length)(v);
907 }
908 else {
909 err_setstr(TypeError, "len() of unsized object");
910 return NULL;
911 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000912 if (len < 0)
913 return NULL;
914 else
915 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000916}
917
918static object *
Guido van Rossumd1705771996-04-09 02:41:06 +0000919builtin_list(self, args)
920 object *self;
921 object *args;
922{
923 object *v;
924 sequence_methods *sqf;
925
926 if (!newgetargs(args, "O:list", &v))
927 return NULL;
928 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
929 int n = (*sqf->sq_length)(v);
930 int i;
931 object *l;
932 if (n < 0)
933 return NULL;
934 l = newlistobject(n);
935 if (l == NULL)
936 return NULL;
937 for (i = 0; i < n; i++) {
938 object *item = (*sqf->sq_item)(v, i);
939 if (item == NULL) {
940 DECREF(l);
941 l = NULL;
942 break;
943 }
944 setlistitem(l, i, item);
945 }
946 /* XXX Should support indefinite-length sequences */
947 return l;
948 }
949 err_setstr(TypeError, "list() argument must be a sequence");
950 return NULL;
951}
952
Guido van Rossum8861b741996-07-30 16:49:37 +0000953
954static PyObject *
955builtin_slice(self, args)
956 PyObject *self;
957 PyObject *args;
958{
959 PyObject *start, *stop, *step;
960
961 start = stop = step = NULL;
962
963 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
964 return NULL;
965
966 /*This swapping of stop and start is to maintain compatibility with
967 the range builtin.*/
968 if (stop == NULL) {
969 stop = start;
970 start = NULL;
971 }
972 return PySlice_New(start, stop, step);
973}
974
Guido van Rossumd1705771996-04-09 02:41:06 +0000975static object *
Guido van Rossum872537c1995-07-07 22:43:42 +0000976builtin_locals(self, args)
977 object *self;
978 object *args;
979{
980 object *d;
981
982 if (!newgetargs(args, ""))
983 return NULL;
984 d = getlocals();
985 INCREF(d);
986 return d;
987}
988
989static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000990builtin_long(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000991 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000992 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000993{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000994 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000995 number_methods *nb;
996
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000997 if (!newgetargs(args, "O:long", &v))
998 return NULL;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000999 if (is_stringobject(v))
1000 return long_from_string(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001001 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001002 nb->nb_long == NULL) {
1003 err_setstr(TypeError,
1004 "long() argument can't be converted to long");
1005 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +00001006 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001007 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +00001008}
1009
1010static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001011min_max(args, sign)
1012 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001013 int sign;
1014{
Guido van Rossum2d951851994-08-29 12:52:16 +00001015 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001016 object *v, *w, *x;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001017 sequence_methods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001018
1019 if (gettuplesize(args) > 1)
1020 v = args;
1021 else if (!newgetargs(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001022 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001023 sq = v->ob_type->tp_as_sequence;
1024 if (sq == NULL) {
1025 err_setstr(TypeError, "min() or max() of non-sequence");
1026 return NULL;
1027 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001028 w = NULL;
1029 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001030 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +00001031 if (x == NULL) {
1032 if (err_occurred() == IndexError) {
1033 err_clear();
1034 break;
1035 }
1036 XDECREF(w);
1037 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001038 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001039 if (w == NULL)
1040 w = x;
1041 else {
1042 if (cmpobject(x, w) * sign > 0) {
1043 DECREF(w);
1044 w = x;
1045 }
1046 else
1047 DECREF(x);
1048 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001049 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001050 if (w == NULL)
1051 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001052 return w;
1053}
1054
1055static object *
1056builtin_min(self, v)
1057 object *self;
1058 object *v;
1059{
1060 return min_max(v, -1);
1061}
1062
1063static object *
1064builtin_max(self, v)
1065 object *self;
1066 object *v;
1067{
1068 return min_max(v, 1);
1069}
1070
1071static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001072builtin_oct(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +00001073 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001074 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001075{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001076 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001077 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001078
1079 if (!newgetargs(args, "O:oct", &v))
1080 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001081 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1082 nb->nb_oct == NULL) {
1083 err_setstr(TypeError,
1084 "oct() argument can't be converted to oct");
1085 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001086 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001087 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001088}
1089
1090static object *
Guido van Rossum94390a41992-08-14 15:14:30 +00001091builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001092 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +00001093 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001094{
Guido van Rossum2d951851994-08-29 12:52:16 +00001095 char *name;
1096 char *mode = "r";
1097 int bufsize = -1;
1098 object *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001099
1100 if (!newgetargs(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001101 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001102 f = newfileobject(name, mode);
1103 if (f != NULL)
1104 setfilebufsize(f, bufsize);
1105 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001106}
1107
1108static object *
Guido van Rossum94390a41992-08-14 15:14:30 +00001109builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001110 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +00001111 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001112{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001113 char c;
1114
1115 if (!newgetargs(args, "c:ord", &c))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001116 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001117 return newintobject((long)(c & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001118}
1119
1120static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001121do_pow(v, w)
1122 object *v, *w;
Guido van Rossumd4905451991-05-05 20:00:36 +00001123{
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001124 object *res;
1125 if (is_instanceobject(v) || is_instanceobject(w))
1126 return instancebinop(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001127 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +00001128 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +00001129 err_setstr(TypeError, "pow() requires numeric arguments");
1130 return NULL;
1131 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001132 if (
1133#ifndef WITHOUT_COMPLEX
1134 !is_complexobject(v) &&
1135#endif
1136 is_floatobject(w) && getfloatvalue(v) < 0.0) {
Guido van Rossum8a1e8eb1995-02-18 14:51:32 +00001137 if (!err_occurred())
1138 err_setstr(ValueError, "negative number to float power");
Guido van Rossum21651581995-02-10 16:57:16 +00001139 return NULL;
1140 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001141 if (coerce(&v, &w) != 0)
1142 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001143 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001144 DECREF(v);
1145 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001146 return res;
1147}
1148
1149static object *
1150builtin_pow(self, args)
1151 object *self;
1152 object *args;
1153{
1154 object *v, *w, *z = None, *res;
1155 object *v1, *z1, *w2, *z2;
1156
1157 if (!newgetargs(args, "OO|O:pow", &v, &w, &z))
1158 return NULL;
1159 if (z == None)
1160 return do_pow(v, w);
1161 /* XXX The ternary version doesn't do class instance coercions */
1162 if (is_instanceobject(v))
1163 return v->ob_type->tp_as_number->nb_power(v, w, z);
1164 if (v->ob_type->tp_as_number == NULL ||
1165 z->ob_type->tp_as_number == NULL ||
1166 w->ob_type->tp_as_number == NULL) {
1167 err_setstr(TypeError, "pow() requires numeric arguments");
1168 return NULL;
1169 }
1170 if (coerce(&v, &w) != 0)
1171 return NULL;
1172 res = NULL;
1173 v1 = v;
1174 z1 = z;
1175 if (coerce(&v1, &z1) != 0)
1176 goto error2;
1177 w2 = w;
1178 z2 = z1;
1179 if (coerce(&w2, &z2) != 0)
1180 goto error1;
1181 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
1182 DECREF(w2);
1183 DECREF(z2);
1184 error1:
1185 DECREF(v1);
1186 DECREF(z1);
1187 error2:
1188 DECREF(v);
1189 DECREF(w);
1190 return res;
Guido van Rossumd4905451991-05-05 20:00:36 +00001191}
1192
1193static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001194builtin_range(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001195 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001196 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001197{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001198 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001199 int i, n;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001200 object *v;
1201
1202 if (gettuplesize(args) <= 1) {
1203 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001204 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001205 &ihigh))
1206 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001207 }
1208 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001209 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001210 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001211 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001212 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001213 }
1214 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001215 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001216 return NULL;
1217 }
1218 /* XXX ought to check overflow of subtraction */
1219 if (istep > 0)
1220 n = (ihigh - ilow + istep - 1) / istep;
1221 else
1222 n = (ihigh - ilow + istep + 1) / istep;
1223 if (n < 0)
1224 n = 0;
1225 v = newlistobject(n);
1226 if (v == NULL)
1227 return NULL;
1228 for (i = 0; i < n; i++) {
1229 object *w = newintobject(ilow);
1230 if (w == NULL) {
1231 DECREF(v);
1232 return NULL;
1233 }
1234 setlistitem(v, i, w);
1235 ilow += istep;
1236 }
1237 return v;
1238}
1239
1240static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001241builtin_xrange(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001242 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001243 object *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001244{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001245 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001246 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001247
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001248 if (gettuplesize(args) <= 1) {
1249 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001250 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001251 &ihigh))
1252 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001253 }
1254 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001255 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001256 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001257 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001258 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001259 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001260 if (istep == 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001261 err_setstr(ValueError, "zero step for xrange()");
1262 return NULL;
1263 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001264 /* XXX ought to check overflow of subtraction */
1265 if (istep > 0)
1266 n = (ihigh - ilow + istep - 1) / istep;
1267 else
1268 n = (ihigh - ilow + istep + 1) / istep;
1269 if (n < 0)
1270 n = 0;
1271 return newrangeobject(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001272}
1273
Guido van Rossum872537c1995-07-07 22:43:42 +00001274extern char *my_readline PROTO((char *));
1275
Guido van Rossum12d12c51993-10-26 17:58:25 +00001276static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001277builtin_raw_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001278 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001279 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001280{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001281 object *v = NULL;
1282 object *f;
1283
1284 if (!newgetargs(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001285 return NULL;
Guido van Rossum872537c1995-07-07 22:43:42 +00001286 if (getfilefile(sysget("stdin")) == stdin &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001287 getfilefile(sysget("stdout")) == stdout &&
1288 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum872537c1995-07-07 22:43:42 +00001289 object *po;
1290 char *prompt;
1291 char *s;
1292 object *result;
1293 if (v != NULL) {
1294 po = strobject(v);
1295 if (po == NULL)
1296 return NULL;
1297 prompt = getstringvalue(po);
1298 }
1299 else {
1300 po = NULL;
1301 prompt = "";
1302 }
1303 s = my_readline(prompt);
1304 XDECREF(po);
1305 if (s == NULL) {
1306 err_set(KeyboardInterrupt);
1307 return NULL;
1308 }
1309 if (*s == '\0') {
1310 err_set(EOFError);
1311 result = NULL;
1312 }
1313 else { /* strip trailing '\n' */
1314 result = newsizedstringobject(s, strlen(s)-1);
1315 }
1316 free(s);
1317 return result;
1318 }
Guido van Rossum90933611991-06-07 16:10:43 +00001319 if (v != NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001320 f = sysget("stdout");
1321 if (f == NULL) {
1322 err_setstr(RuntimeError, "lost sys.stdout");
1323 return NULL;
1324 }
1325 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +00001326 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001327 return NULL;
1328 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001329 f = sysget("stdin");
1330 if (f == NULL) {
1331 err_setstr(RuntimeError, "lost sys.stdin");
1332 return NULL;
1333 }
1334 return filegetline(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001335}
1336
1337static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001338builtin_reduce(self, args)
1339 object *self;
1340 object *args;
1341{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001342 object *seq, *func, *result = NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001343 sequence_methods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001344 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001345
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001346 if (!newgetargs(args, "OO|O:reduce", &func, &seq, &result))
1347 return NULL;
1348 if (result != NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001349 INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001350
1351 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
1352 err_setstr(TypeError,
1353 "2nd argument to reduce() must be a sequence object");
1354 return NULL;
1355 }
1356
Guido van Rossum12d12c51993-10-26 17:58:25 +00001357 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001358 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001359
Guido van Rossum2d951851994-08-29 12:52:16 +00001360 for (i = 0; ; ++i) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001361 object *op2;
1362
1363 if (args->ob_refcnt > 1) {
1364 DECREF(args);
1365 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001366 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001367 }
1368
Guido van Rossum2d951851994-08-29 12:52:16 +00001369 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
1370 if (err_occurred() == IndexError) {
1371 err_clear();
1372 break;
1373 }
1374 goto Fail;
1375 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001376
Guido van Rossum2d951851994-08-29 12:52:16 +00001377 if (result == NULL)
1378 result = op2;
1379 else {
1380 settupleitem(args, 0, result);
1381 settupleitem(args, 1, op2);
1382 if ((result = call_object(func, args)) == NULL)
1383 goto Fail;
1384 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001385 }
1386
1387 DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001388
Guido van Rossum2d951851994-08-29 12:52:16 +00001389 if (result == NULL)
1390 err_setstr(TypeError,
1391 "reduce of empty sequence with no initial value");
1392
Guido van Rossum12d12c51993-10-26 17:58:25 +00001393 return result;
1394
Guido van Rossum2d951851994-08-29 12:52:16 +00001395Fail:
1396 XDECREF(args);
1397 XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001398 return NULL;
1399}
1400
1401static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001402builtin_reload(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001403 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001404 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001405{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001406 object *v;
1407
1408 if (!newgetargs(args, "O:reload", &v))
1409 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001410 return reload_module(v);
1411}
1412
1413static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001414builtin_repr(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001415 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001416 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001417{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001418 object *v;
1419
1420 if (!newgetargs(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001421 return NULL;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001422 return reprobject(v);
1423}
1424
1425static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001426builtin_round(self, args)
1427 object *self;
1428 object *args;
1429{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001430 double x;
1431 double f;
1432 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001433 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001434
1435 if (!newgetargs(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001436 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001437 f = 1.0;
1438 for (i = ndigits; --i >= 0; )
1439 f = f*10.0;
1440 for (i = ndigits; ++i <= 0; )
1441 f = f*0.1;
1442 if (x >= 0.0)
1443 return newfloatobject(floor(x*f + 0.5) / f);
1444 else
1445 return newfloatobject(ceil(x*f - 0.5) / f);
1446}
1447
1448static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001449builtin_str(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001450 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001451 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001452{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001453 object *v;
1454
1455 if (!newgetargs(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001456 return NULL;
Guido van Rossumc6004111993-11-05 10:22:19 +00001457 return strobject(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001458}
1459
1460static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001461builtin_tuple(self, args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001462 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001463 object *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001464{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001465 object *v;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001466 sequence_methods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001467
1468 if (!newgetargs(args, "O:tuple", &v))
1469 return NULL;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001470 if (is_tupleobject(v)) {
1471 INCREF(v);
1472 return v;
1473 }
Guido van Rossume4ab6471994-08-30 12:38:05 +00001474 if (is_listobject(v))
1475 return listtuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001476 if (is_stringobject(v)) {
1477 int n = getstringsize(v);
1478 object *t = newtupleobject(n);
1479 if (t != NULL) {
1480 int i;
1481 char *p = getstringvalue(v);
1482 for (i = 0; i < n; i++) {
1483 object *item = newsizedstringobject(p+i, 1);
1484 if (item == NULL) {
1485 DECREF(t);
1486 t = NULL;
1487 break;
1488 }
1489 settupleitem(t, i, item);
1490 }
1491 }
1492 return t;
1493 }
1494 /* Generic sequence object */
1495 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1496 int n = (*sqf->sq_length)(v);
1497 int i;
1498 object *t;
1499 if (n < 0)
1500 return NULL;
1501 t = newtupleobject(n);
1502 if (t == NULL)
1503 return NULL;
1504 for (i = 0; i < n; i++) {
1505 object *item = (*sqf->sq_item)(v, i);
1506 if (item == NULL) {
1507 DECREF(t);
1508 t = NULL;
1509 break;
1510 }
1511 settupleitem(t, i, item);
1512 }
1513 /* XXX Should support indefinite-length sequences */
1514 return t;
1515 }
1516 /* None of the above */
1517 err_setstr(TypeError, "tuple() argument must be a sequence");
1518 return NULL;
1519}
1520
1521static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001522builtin_type(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001523 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001524 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001525{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001526 object *v;
1527
1528 if (!newgetargs(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001529 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001530 v = (object *)v->ob_type;
1531 INCREF(v);
1532 return v;
1533}
1534
Guido van Rossum2d951851994-08-29 12:52:16 +00001535static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001536builtin_vars(self, args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001537 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001538 object *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001539{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001540 object *v = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001541 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001542
1543 if (!newgetargs(args, "|O:vars", &v))
1544 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001545 if (v == NULL) {
1546 d = getlocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001547 if (d == NULL) {
1548 if (!err_occurred())
1549 err_setstr(SystemError, "no locals!?");
1550 }
1551 else
1552 INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00001553 }
1554 else {
1555 d = getattr(v, "__dict__");
1556 if (d == NULL) {
1557 err_setstr(TypeError,
1558 "vars() argument must have __dict__ attribute");
1559 return NULL;
1560 }
1561 }
1562 return d;
1563}
1564
Guido van Rossum3f5da241990-12-20 15:06:42 +00001565static struct methodlist builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001566 {"__import__", builtin___import__, 1},
1567 {"abs", builtin_abs, 1},
1568 {"apply", builtin_apply, 1},
1569 {"callable", builtin_callable, 1},
1570 {"chr", builtin_chr, 1},
1571 {"cmp", builtin_cmp, 1},
1572 {"coerce", builtin_coerce, 1},
1573 {"compile", builtin_compile, 1},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001574#ifndef WITHOUT_COMPLEX
1575 {"complex", builtin_complex, 1},
1576#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001577 {"delattr", builtin_delattr, 1},
1578 {"dir", builtin_dir, 1},
1579 {"divmod", builtin_divmod, 1},
1580 {"eval", builtin_eval, 1},
1581 {"execfile", builtin_execfile, 1},
1582 {"filter", builtin_filter, 1},
1583 {"float", builtin_float, 1},
1584 {"getattr", builtin_getattr, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001585 {"globals", builtin_globals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001586 {"hasattr", builtin_hasattr, 1},
1587 {"hash", builtin_hash, 1},
1588 {"hex", builtin_hex, 1},
1589 {"id", builtin_id, 1},
1590 {"input", builtin_input, 1},
Guido van Rossume8811f81997-02-14 15:48:05 +00001591 {"intern", builtin_intern, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001592 {"int", builtin_int, 1},
1593 {"len", builtin_len, 1},
Guido van Rossumd1705771996-04-09 02:41:06 +00001594 {"list", builtin_list, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001595 {"locals", builtin_locals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001596 {"long", builtin_long, 1},
1597 {"map", builtin_map, 1},
1598 {"max", builtin_max, 1},
1599 {"min", builtin_min, 1},
1600 {"oct", builtin_oct, 1},
1601 {"open", builtin_open, 1},
1602 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001603 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001604 {"range", builtin_range, 1},
1605 {"raw_input", builtin_raw_input, 1},
1606 {"reduce", builtin_reduce, 1},
1607 {"reload", builtin_reload, 1},
1608 {"repr", builtin_repr, 1},
1609 {"round", builtin_round, 1},
1610 {"setattr", builtin_setattr, 1},
Guido van Rossum8861b741996-07-30 16:49:37 +00001611 {"slice", builtin_slice, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001612 {"str", builtin_str, 1},
1613 {"tuple", builtin_tuple, 1},
1614 {"type", builtin_type, 1},
1615 {"vars", builtin_vars, 1},
1616 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001617 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001618};
1619
Guido van Rossum0865dd91995-01-17 16:30:22 +00001620static object *builtin_mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001621static object *builtin_dict;
1622
1623object *
Guido van Rossum0865dd91995-01-17 16:30:22 +00001624getbuiltinmod()
1625{
1626 return builtin_mod;
1627}
1628
1629object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001630getbuiltindict()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001631{
Guido van Rossum6135a871995-01-09 17:53:26 +00001632 return builtin_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001633}
1634
1635/* Predefined exceptions */
1636
Guido van Rossum25831651993-05-19 14:50:45 +00001637object *AccessError;
Guido van Rossumc6472e91997-03-31 17:15:43 +00001638object *PyExc_AssertionError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001639object *AttributeError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001640object *EOFError;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001641object *FloatingPointError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001642object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001643object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001644object *IndexError;
1645object *KeyError;
1646object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001647object *MemoryError;
1648object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001649object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001650object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001651object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001652object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001653object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001654object *TypeError;
1655object *ValueError;
1656object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001657
Guido van Rossum3f5da241990-12-20 15:06:42 +00001658static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001659newstdexception(name)
1660 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001661{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001662 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001663 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1664 fatal("no mem for new standard exception");
1665 return v;
1666}
1667
1668static void
1669initerrors()
1670{
Guido van Rossum25831651993-05-19 14:50:45 +00001671 AccessError = newstdexception("AccessError");
Guido van Rossumc6472e91997-03-31 17:15:43 +00001672 PyExc_AssertionError = newstdexception("AssertionError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001673 AttributeError = newstdexception("AttributeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001674 EOFError = newstdexception("EOFError");
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001675 FloatingPointError = newstdexception("FloatingPointError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001676 IOError = newstdexception("IOError");
1677 ImportError = newstdexception("ImportError");
1678 IndexError = newstdexception("IndexError");
1679 KeyError = newstdexception("KeyError");
1680 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001681 MemoryError = newstdexception("MemoryError");
1682 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001683 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001684 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001685 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001686 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001687 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001688 TypeError = newstdexception("TypeError");
1689 ValueError = newstdexception("ValueError");
1690 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001691}
1692
1693void
1694initbuiltin()
1695{
Guido van Rossum0865dd91995-01-17 16:30:22 +00001696 builtin_mod = initmodule("__builtin__", builtin_methods);
1697 builtin_dict = getmoduledict(builtin_mod);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001698 INCREF(builtin_dict);
1699 initerrors();
1700 (void) dictinsert(builtin_dict, "None", None);
Guido van Rossume449af71996-10-11 16:25:41 +00001701 (void) dictinsert(builtin_dict, "Ellipsis", Py_Ellipsis);
Guido van Rossum1c6a4591997-03-11 18:43:26 +00001702 (void) dictinsert(builtin_dict, "__debug__",
1703 newintobject(Py_OptimizeFlag == 0));
1704 if (err_occurred())
1705 fatal("error creating None/Ellipsis/__debug__ in __builtin__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001706}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001707
Guido van Rossum12d12c51993-10-26 17:58:25 +00001708
Guido van Rossume77a7571993-11-03 15:01:26 +00001709/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001710
1711static object *
1712filtertuple(func, tuple)
1713 object *func;
1714 object *tuple;
1715{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001716 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001717 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001718 int len = gettuplesize(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001719
Guido van Rossumb7b45621995-08-04 04:07:45 +00001720 if (len == 0) {
1721 INCREF(tuple);
1722 return tuple;
1723 }
1724
Guido van Rossum2586bf01993-11-01 16:21:44 +00001725 if ((result = newtupleobject(len)) == NULL)
1726 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001727
Guido van Rossum12d12c51993-10-26 17:58:25 +00001728 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001729 object *item, *good;
1730 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001731
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001732 if ((item = gettupleitem(tuple, i)) == NULL)
1733 goto Fail_1;
1734 if (func == None) {
1735 INCREF(item);
1736 good = item;
1737 }
1738 else {
1739 object *arg = mkvalue("(O)", item);
1740 if (arg == NULL)
1741 goto Fail_1;
1742 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001743 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001744 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001745 goto Fail_1;
1746 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001747 ok = testbool(good);
1748 DECREF(good);
1749 if (ok) {
1750 INCREF(item);
1751 if (settupleitem(result, j++, item) < 0)
1752 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001753 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001754 }
1755
Sjoerd Mullender615194a1993-11-01 13:46:50 +00001756 if (resizetuple(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001757 return NULL;
1758
Guido van Rossum12d12c51993-10-26 17:58:25 +00001759 return result;
1760
Guido van Rossum12d12c51993-10-26 17:58:25 +00001761Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001762 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001763 return NULL;
1764}
1765
1766
Guido van Rossume77a7571993-11-03 15:01:26 +00001767/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001768
1769static object *
1770filterstring(func, strobj)
1771 object *func;
1772 object *strobj;
1773{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001774 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001775 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001776 int len = getstringsize(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001777
Guido van Rossum2586bf01993-11-01 16:21:44 +00001778 if (func == None) {
1779 /* No character is ever false -- share input string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001780 INCREF(strobj);
1781 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001782 }
Guido van Rossum2586bf01993-11-01 16:21:44 +00001783 if ((result = newsizedstringobject(NULL, len)) == NULL)
1784 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001785
Guido van Rossum12d12c51993-10-26 17:58:25 +00001786 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001787 object *item, *arg, *good;
1788 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001789
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001790 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1791 if (item == NULL)
1792 goto Fail_1;
1793 arg = mkvalue("(O)", item);
1794 DECREF(item);
1795 if (arg == NULL)
1796 goto Fail_1;
1797 good = call_object(func, arg);
1798 DECREF(arg);
1799 if (good == NULL)
1800 goto Fail_1;
1801 ok = testbool(good);
1802 DECREF(good);
1803 if (ok)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001804 GETSTRINGVALUE((stringobject *)result)[j++] =
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001805 GETSTRINGVALUE((stringobject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001806 }
1807
Guido van Rossum79d96d61996-08-16 20:44:34 +00001808 if (j < len && resizestring(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001809 return NULL;
1810
Guido van Rossum12d12c51993-10-26 17:58:25 +00001811 return result;
1812
Guido van Rossum12d12c51993-10-26 17:58:25 +00001813Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001814 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001815 return NULL;
1816}
Guido van Rossumc6472e91997-03-31 17:15:43 +00001817
1818/* Copied with modifications from stropmodule.c: atoi,atof.atol */
1819
1820static PyObject *
1821int_from_string(v)
1822 PyObject *v;
1823{
1824 extern long PyOS_strtol Py_PROTO((const char *, char **, int));
1825 char *s, *end;
1826 long x;
1827 char buffer[256]; /* For errors */
1828
1829 if (!PyArg_Parse(v, "s", &s))
1830 return NULL;
1831 while (*s && isspace(Py_CHARMASK(*s)))
1832 s++;
1833 if (s[0] == '\0') {
1834 PyErr_SetString(PyExc_ValueError, "empty string for int()");
1835 return NULL;
1836 }
1837 errno = 0;
1838 x = PyOS_strtol(s, &end, 10);
1839 while (*end && isspace(Py_CHARMASK(*end)))
1840 end++;
1841 if (*end != '\0') {
1842 sprintf(buffer, "invalid literal for int(): %.200s", s);
1843 PyErr_SetString(PyExc_ValueError, buffer);
1844 return NULL;
1845 }
1846 else if (errno != 0) {
1847 sprintf(buffer, "int() literal too large: %.200s", s);
1848 PyErr_SetString(PyExc_ValueError, buffer);
1849 return NULL;
1850 }
1851 return PyInt_FromLong(x);
1852}
1853
1854static PyObject *
1855long_from_string(v)
1856 PyObject *v;
1857{
1858 char *s, *end;
1859 PyObject *x;
1860 char buffer[256]; /* For errors */
1861
1862 if (!PyArg_Parse(v, "s", &s))
1863 return NULL;
1864
1865 while (*s && isspace(Py_CHARMASK(*s)))
1866 s++;
1867 if (s[0] == '\0') {
1868 PyErr_SetString(PyExc_ValueError, "empty string for long()");
1869 return NULL;
1870 }
1871 x = PyLong_FromString(s, &end, 10);
1872 if (x == NULL)
1873 return NULL;
1874 while (*end && isspace(Py_CHARMASK(*end)))
1875 end++;
1876 if (*end != '\0') {
1877 sprintf(buffer, "invalid literal for long(): %.200s", s);
1878 PyErr_SetString(PyExc_ValueError, buffer);
1879 Py_DECREF(x);
1880 return NULL;
1881 }
1882 return x;
1883}
1884
1885static PyObject *
1886float_from_string(v)
1887 PyObject *v;
1888{
1889 extern double strtod Py_PROTO((const char *, char **));
1890 char *s, *end;
1891 double x;
1892 char buffer[256]; /* For errors */
1893
1894 if (!PyArg_Parse(v, "s", &s))
1895 return NULL;
1896 while (*s && isspace(Py_CHARMASK(*s)))
1897 s++;
1898 if (s[0] == '\0') {
1899 PyErr_SetString(PyExc_ValueError, "empty string for float()");
1900 return NULL;
1901 }
1902 errno = 0;
1903 PyFPE_START_PROTECT("float_from_string", return 0)
1904 x = strtod(s, &end);
1905 PyFPE_END_PROTECT(x)
1906 while (*end && isspace(Py_CHARMASK(*end)))
1907 end++;
1908 if (*end != '\0') {
1909 sprintf(buffer, "invalid literal for float(): %.200s", s);
1910 PyErr_SetString(PyExc_ValueError, buffer);
1911 return NULL;
1912 }
1913 else if (errno != 0) {
1914 sprintf(buffer, "float() literal too large: %.200s", s);
1915 PyErr_SetString(PyExc_ValueError, buffer);
1916 return NULL;
1917 }
1918 return PyFloat_FromDouble(x);
1919}