blob: a00cd5dbf8d4a47ec62c363be8f5f885010b59e0 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum3f5da241990-12-20 15:06:42 +000011/* Built-in functions */
12
Guido van Rossum79f25d91997-04-29 20:08:16 +000013#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000014
15#include "node.h"
Guido van Rossum5b722181993-03-30 17:46:03 +000016#include "compile.h"
17#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000018
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +000019#include "mymath.h"
20
Guido van Rossum6bf62da1997-04-11 20:37:35 +000021#include <ctype.h>
22
Guido van Rossum1a2c5cb1996-12-10 15:37:36 +000023#ifdef HAVE_UNISTD_H
24#include <unistd.h>
25#endif
Jack Jansen41aa8e52000-07-03 21:39:47 +000026#ifdef HAVE_LIMITS_H
27#include <limits.h>
28#endif
Guido van Rossum1a2c5cb1996-12-10 15:37:36 +000029
Guido van Rossum12d12c51993-10-26 17:58:25 +000030/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000031static PyObject *filterstring(PyObject *, PyObject *);
32static PyObject *filtertuple (PyObject *, PyObject *);
Guido van Rossum12d12c51993-10-26 17:58:25 +000033
Guido van Rossum79f25d91997-04-29 20:08:16 +000034static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +000035builtin___import__(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +000036 PyObject *self;
37 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +000038{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000039 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +000040 PyObject *globals = NULL;
41 PyObject *locals = NULL;
42 PyObject *fromlist = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000043
Guido van Rossum79f25d91997-04-29 20:08:16 +000044 if (!PyArg_ParseTuple(args, "s|OOO:__import__",
Guido van Rossum24c13741995-02-14 09:42:43 +000045 &name, &globals, &locals, &fromlist))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000046 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +000047 return PyImport_ImportModuleEx(name, globals, locals, fromlist);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000048}
49
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +000050static char import_doc[] =
51"__import__(name, globals, locals, fromlist) -> module\n\
52\n\
53Import a module. The globals are only used to determine the context;\n\
54they are not modified. The locals are currently unused. The fromlist\n\
55should be a list of names to emulate ``from name import ...'', or an\n\
56empty list to emulate ``import name''.\n\
57When importing a module from a package, note that __import__('A.B', ...)\n\
58returns package A when fromlist is empty, but its submodule B when\n\
59fromlist is not empty.";
60
Guido van Rossum1ae940a1995-01-02 19:04:15 +000061
Guido van Rossum79f25d91997-04-29 20:08:16 +000062static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +000063builtin_abs(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +000064 PyObject *self;
65 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000066{
Guido van Rossum79f25d91997-04-29 20:08:16 +000067 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000068
Guido van Rossum79f25d91997-04-29 20:08:16 +000069 if (!PyArg_ParseTuple(args, "O:abs", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000070 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +000071 return PyNumber_Absolute(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000072}
73
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +000074static char abs_doc[] =
75"abs(number) -> number\n\
76\n\
77Return the absolute value of the argument.";
78
79
Guido van Rossum79f25d91997-04-29 20:08:16 +000080static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +000081builtin_apply(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +000082 PyObject *self;
83 PyObject *args;
Guido van Rossumc02e15c1991-12-16 13:03:00 +000084{
Guido van Rossum79f25d91997-04-29 20:08:16 +000085 PyObject *func, *alist = NULL, *kwdict = NULL;
Barry Warsaw968f8cb1998-10-01 15:33:12 +000086 PyObject *t = NULL, *retval = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000087
Guido van Rossum79f25d91997-04-29 20:08:16 +000088 if (!PyArg_ParseTuple(args, "O|OO:apply", &func, &alist, &kwdict))
Guido van Rossumc02e15c1991-12-16 13:03:00 +000089 return NULL;
Barry Warsaw968f8cb1998-10-01 15:33:12 +000090 if (alist != NULL) {
91 if (!PyTuple_Check(alist)) {
92 if (!PySequence_Check(alist)) {
93 PyErr_SetString(PyExc_TypeError,
94 "apply() 2nd argument must be a sequence");
95 return NULL;
96 }
97 t = PySequence_Tuple(alist);
98 if (t == NULL)
99 return NULL;
100 alist = t;
101 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000102 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000103 if (kwdict != NULL && !PyDict_Check(kwdict)) {
104 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000105 "apply() 3rd argument must be dictionary");
Barry Warsaw968f8cb1998-10-01 15:33:12 +0000106 goto finally;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000107 }
Barry Warsaw968f8cb1998-10-01 15:33:12 +0000108 retval = PyEval_CallObjectWithKeywords(func, alist, kwdict);
109 finally:
110 Py_XDECREF(t);
111 return retval;
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000112}
113
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000114static char apply_doc[] =
Fred Drake7b912121999-12-23 14:16:55 +0000115"apply(object, args[, kwargs]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000116\n\
Fred Drake7b912121999-12-23 14:16:55 +0000117Call a callable object with positional arguments taken from the tuple args,\n\
118and keyword arguments taken from the optional dictionary kwargs.\n\
119Note that classes are callable, as are instances with a __call__() method.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000120
121
Guido van Rossum79f25d91997-04-29 20:08:16 +0000122static PyObject *
Guido van Rossum0daf0221999-03-19 19:07:19 +0000123builtin_buffer(self, args)
124 PyObject *self;
125 PyObject *args;
126{
127 PyObject *ob;
128 int offset = 0;
129 int size = Py_END_OF_BUFFER;
130
131 if ( !PyArg_ParseTuple(args, "O|ii:buffer", &ob, &offset, &size) )
132 return NULL;
133 return PyBuffer_FromObject(ob, offset, size);
134}
135
136static char buffer_doc[] =
Guido van Rossum09095f32000-03-10 23:00:52 +0000137"buffer(object [, offset[, size]]) -> object\n\
Guido van Rossum0daf0221999-03-19 19:07:19 +0000138\n\
139Creates a new buffer object which references the given object.\n\
140The buffer will reference a slice of the target object from the\n\
141start of the object (or at the specified offset). The slice will\n\
142extend to the end of the target object (or with the specified size).";
143
144
145static PyObject *
Guido van Rossum09095f32000-03-10 23:00:52 +0000146builtin_unicode(self, args)
147 PyObject *self;
148 PyObject *args;
149{
Guido van Rossum3afba762000-04-11 15:38:23 +0000150 PyObject *v;
Guido van Rossum09095f32000-03-10 23:00:52 +0000151 char *encoding = NULL;
152 char *errors = NULL;
153
Guido van Rossum3afba762000-04-11 15:38:23 +0000154 if ( !PyArg_ParseTuple(args, "O|ss:unicode", &v, &encoding, &errors) )
Guido van Rossum09095f32000-03-10 23:00:52 +0000155 return NULL;
Marc-André Lemburg1b1bcc92000-07-07 13:48:25 +0000156 return PyUnicode_FromEncodedObject(v, encoding, errors);
Guido van Rossum09095f32000-03-10 23:00:52 +0000157}
158
159static char unicode_doc[] =
160"unicode(string [, encoding[, errors]]) -> object\n\
161\n\
Fred Drake078b24f2000-04-13 02:42:50 +0000162Creates a new Unicode object from the given encoded string.\n\
Fred Drakec640b182000-05-09 19:55:16 +0000163encoding defaults to the current default string encoding and \n\
164errors, defining the error handling, to 'strict'.";
Guido van Rossum09095f32000-03-10 23:00:52 +0000165
166
167static PyObject *
Guido van Rossum2d951851994-08-29 12:52:16 +0000168builtin_callable(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000169 PyObject *self;
170 PyObject *args;
Guido van Rossum2d951851994-08-29 12:52:16 +0000171{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000173
Guido van Rossum79f25d91997-04-29 20:08:16 +0000174 if (!PyArg_ParseTuple(args, "O:callable", &v))
Guido van Rossum2d951851994-08-29 12:52:16 +0000175 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000176 return PyInt_FromLong((long)PyCallable_Check(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000177}
178
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000179static char callable_doc[] =
180"callable(object) -> Boolean\n\
181\n\
182Return whether the object is callable (i.e., some kind of function).\n\
183Note that classes are callable, as are instances with a __call__() method.";
184
185
Guido van Rossum79f25d91997-04-29 20:08:16 +0000186static PyObject *
Guido van Rossume77a7571993-11-03 15:01:26 +0000187builtin_filter(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000188 PyObject *self;
189 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000190{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000191 PyObject *func, *seq, *result;
192 PySequenceMethods *sqf;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000193 int len;
194 register int i, j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000195
Guido van Rossum79f25d91997-04-29 20:08:16 +0000196 if (!PyArg_ParseTuple(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000197 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000198
Guido van Rossum79f25d91997-04-29 20:08:16 +0000199 if (PyString_Check(seq)) {
200 PyObject *r = filterstring(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000201 return r;
202 }
203
Guido van Rossum79f25d91997-04-29 20:08:16 +0000204 if (PyTuple_Check(seq)) {
205 PyObject *r = filtertuple(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000206 return r;
207 }
208
Guido van Rossum09df08a1998-05-22 00:51:39 +0000209 sqf = seq->ob_type->tp_as_sequence;
210 if (sqf == NULL || sqf->sq_length == NULL || sqf->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000211 PyErr_SetString(PyExc_TypeError,
Guido van Rossume77a7571993-11-03 15:01:26 +0000212 "argument 2 to filter() must be a sequence type");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000213 goto Fail_2;
214 }
215
216 if ((len = (*sqf->sq_length)(seq)) < 0)
217 goto Fail_2;
218
Guido van Rossum79f25d91997-04-29 20:08:16 +0000219 if (PyList_Check(seq) && seq->ob_refcnt == 1) {
220 Py_INCREF(seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000221 result = seq;
222 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000223 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000224 if ((result = PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000225 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000226 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000227
Guido van Rossum2d951851994-08-29 12:52:16 +0000228 for (i = j = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000229 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000230 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000231
Guido van Rossum2d951851994-08-29 12:52:16 +0000232 if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +0000233 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000234 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +0000235 break;
236 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000237 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000238 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000239
Guido van Rossum79f25d91997-04-29 20:08:16 +0000240 if (func == Py_None) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000241 good = item;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000242 Py_INCREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000243 }
244 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000245 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000246 if (arg == NULL)
247 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000248 good = PyEval_CallObject(func, arg);
249 Py_DECREF(arg);
Guido van Rossum58b68731995-01-10 17:40:55 +0000250 if (good == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000251 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000252 goto Fail_1;
Guido van Rossum58b68731995-01-10 17:40:55 +0000253 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000254 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000255 ok = PyObject_IsTrue(good);
256 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000257 if (ok) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000258 if (j < len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000259 if (PyList_SetItem(result, j++, item) < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000260 goto Fail_1;
261 }
262 else {
Barry Warsawfa77e091999-01-28 18:49:12 +0000263 int status = PyList_Append(result, item);
Guido van Rossum2d951851994-08-29 12:52:16 +0000264 j++;
Barry Warsawfa77e091999-01-28 18:49:12 +0000265 Py_DECREF(item);
266 if (status < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000267 goto Fail_1;
268 }
Guido van Rossum58b68731995-01-10 17:40:55 +0000269 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000271 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000272 }
273
Guido van Rossum12d12c51993-10-26 17:58:25 +0000274
Guido van Rossum79f25d91997-04-29 20:08:16 +0000275 if (j < len && PyList_SetSlice(result, j, len, NULL) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000276 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000277
Guido van Rossum12d12c51993-10-26 17:58:25 +0000278 return result;
279
Guido van Rossum12d12c51993-10-26 17:58:25 +0000280Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000281 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000282Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000283 return NULL;
284}
285
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000286static char filter_doc[] =
287"filter(function, sequence) -> list\n\
288\n\
289Return a list containing those items of sequence for which function(item)\n\
290is true. If function is None, return a list of items that are true.";
291
292
Guido van Rossum79f25d91997-04-29 20:08:16 +0000293static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +0000294builtin_chr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000295 PyObject *self;
296 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000297{
298 long x;
299 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000300
Guido van Rossum79f25d91997-04-29 20:08:16 +0000301 if (!PyArg_ParseTuple(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000302 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000303 if (x < 0 || x >= 256) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000304 PyErr_SetString(PyExc_ValueError,
305 "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000306 return NULL;
307 }
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000308 s[0] = (char)x;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000309 return PyString_FromStringAndSize(s, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000310}
311
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000312static char chr_doc[] =
313"chr(i) -> character\n\
314\n\
315Return a string of one character with ordinal i; 0 <= i < 256.";
316
317
Guido van Rossum79f25d91997-04-29 20:08:16 +0000318static PyObject *
Guido van Rossum09095f32000-03-10 23:00:52 +0000319builtin_unichr(self, args)
320 PyObject *self;
321 PyObject *args;
322{
323 long x;
324 Py_UNICODE s[1];
325
326 if (!PyArg_ParseTuple(args, "l:unichr", &x))
327 return NULL;
328 if (x < 0 || x >= 65536) {
329 PyErr_SetString(PyExc_ValueError,
330 "unichr() arg not in range(65536)");
331 return NULL;
332 }
333 s[0] = (Py_UNICODE)x;
334 return PyUnicode_FromUnicode(s, 1);
335}
336
337static char unichr_doc[] =
Fred Drake078b24f2000-04-13 02:42:50 +0000338"unichr(i) -> Unicode character\n\
Guido van Rossum09095f32000-03-10 23:00:52 +0000339\n\
Fred Drake078b24f2000-04-13 02:42:50 +0000340Return a Unicode string of one character with ordinal i; 0 <= i < 65536.";
Guido van Rossum09095f32000-03-10 23:00:52 +0000341
342
343static PyObject *
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000344builtin_cmp(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000345 PyObject *self;
346 PyObject *args;
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000347{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000348 PyObject *a, *b;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000349 int c;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000350
Guido van Rossum79f25d91997-04-29 20:08:16 +0000351 if (!PyArg_ParseTuple(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000352 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000353 if (PyObject_Cmp(a, b, &c) < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000354 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000355 return PyInt_FromLong((long)c);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000356}
357
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000358static char cmp_doc[] =
359"cmp(x, y) -> integer\n\
360\n\
361Return negative if x<y, zero if x==y, positive if x>y.";
362
363
Guido van Rossum79f25d91997-04-29 20:08:16 +0000364static PyObject *
Guido van Rossum5524a591995-01-10 15:26:20 +0000365builtin_coerce(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000366 PyObject *self;
367 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000368{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000369 PyObject *v, *w;
370 PyObject *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000371
Guido van Rossum79f25d91997-04-29 20:08:16 +0000372 if (!PyArg_ParseTuple(args, "OO:coerce", &v, &w))
Guido van Rossum5524a591995-01-10 15:26:20 +0000373 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000374 if (PyNumber_Coerce(&v, &w) < 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000375 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000376 res = Py_BuildValue("(OO)", v, w);
377 Py_DECREF(v);
378 Py_DECREF(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000379 return res;
380}
381
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000382static char coerce_doc[] =
383"coerce(x, y) -> None or (x1, y1)\n\
384\n\
385When x and y can be coerced to values of the same type, return a tuple\n\
386containing the coerced values. When they can't be coerced, return None.";
387
388
Guido van Rossum79f25d91997-04-29 20:08:16 +0000389static PyObject *
Guido van Rossum5b722181993-03-30 17:46:03 +0000390builtin_compile(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000391 PyObject *self;
392 PyObject *args;
Guido van Rossum5b722181993-03-30 17:46:03 +0000393{
394 char *str;
395 char *filename;
396 char *startstr;
397 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000398
Guido van Rossum79f25d91997-04-29 20:08:16 +0000399 if (!PyArg_ParseTuple(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000400 return NULL;
401 if (strcmp(startstr, "exec") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000402 start = Py_file_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000403 else if (strcmp(startstr, "eval") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000404 start = Py_eval_input;
Guido van Rossum872537c1995-07-07 22:43:42 +0000405 else if (strcmp(startstr, "single") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000406 start = Py_single_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000407 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000408 PyErr_SetString(PyExc_ValueError,
Guido van Rossum872537c1995-07-07 22:43:42 +0000409 "compile() mode must be 'exec' or 'eval' or 'single'");
Guido van Rossum5b722181993-03-30 17:46:03 +0000410 return NULL;
411 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000412 return Py_CompileString(str, filename, start);
Guido van Rossum5b722181993-03-30 17:46:03 +0000413}
414
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000415static char compile_doc[] =
416"compile(source, filename, mode) -> code object\n\
417\n\
418Compile the source string (a Python module, statement or expression)\n\
419into a code object that can be executed by the exec statement or eval().\n\
420The filename will be used for run-time error messages.\n\
421The mode must be 'exec' to compile a module, 'single' to compile a\n\
422single (interactive) statement, or 'eval' to compile an expression.";
423
424
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000425#ifndef WITHOUT_COMPLEX
426
Guido van Rossum79f25d91997-04-29 20:08:16 +0000427static PyObject *
Guido van Rossum11950231999-03-25 21:16:07 +0000428complex_from_string(v)
429 PyObject *v;
430{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000431 extern double strtod(const char *, char **);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000432 const char *s, *start;
433 char *end;
Guido van Rossum11950231999-03-25 21:16:07 +0000434 double x=0.0, y=0.0, z;
435 int got_re=0, got_im=0, done=0;
436 int digit_or_dot;
437 int sw_error=0;
438 int sign;
439 char buffer[256]; /* For errors */
Guido van Rossum9e896b32000-04-05 20:11:21 +0000440 int len;
Guido van Rossum11950231999-03-25 21:16:07 +0000441
Guido van Rossum9e896b32000-04-05 20:11:21 +0000442 if (PyString_Check(v)) {
443 s = PyString_AS_STRING(v);
444 len = PyString_GET_SIZE(v);
445 }
446 else if (PyUnicode_Check(v)) {
447 char s_buffer[256];
448
449 if (PyUnicode_GET_SIZE(v) >= sizeof(s_buffer)) {
450 PyErr_SetString(PyExc_ValueError,
451 "complex() literal too large to convert");
452 return NULL;
453 }
454 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
455 PyUnicode_GET_SIZE(v),
456 s_buffer,
457 NULL))
458 return NULL;
459 s = s_buffer;
460 len = strlen(s);
461 }
462 else if (PyObject_AsCharBuffer(v, &s, &len)) {
463 PyErr_SetString(PyExc_TypeError,
464 "complex() needs a string first argument");
465 return NULL;
466 }
Guido van Rossum11950231999-03-25 21:16:07 +0000467
468 /* position on first nonblank */
Guido van Rossum9e896b32000-04-05 20:11:21 +0000469 start = s;
Guido van Rossum11950231999-03-25 21:16:07 +0000470 while (*s && isspace(Py_CHARMASK(*s)))
471 s++;
472 if (s[0] == '\0') {
473 PyErr_SetString(PyExc_ValueError,
474 "empty string for complex()");
475 return NULL;
476 }
477
478 z = -1.0;
479 sign = 1;
480 do {
481
482 switch (*s) {
483
484 case '\0':
Guido van Rossum9e896b32000-04-05 20:11:21 +0000485 if (s-start != len) {
Guido van Rossum11950231999-03-25 21:16:07 +0000486 PyErr_SetString(
487 PyExc_ValueError,
488 "null byte in argument for complex()");
489 return NULL;
490 }
491 if(!done) sw_error=1;
492 break;
493
494 case '-':
495 sign = -1;
496 /* Fallthrough */
497 case '+':
498 if (done) sw_error=1;
499 s++;
500 if ( *s=='\0'||*s=='+'||*s=='-' ||
501 isspace(Py_CHARMASK(*s)) ) sw_error=1;
502 break;
503
504 case 'J':
505 case 'j':
506 if (got_im || done) {
507 sw_error = 1;
508 break;
509 }
510 if (z<0.0) {
511 y=sign;
512 }
513 else{
514 y=sign*z;
515 }
516 got_im=1;
517 s++;
518 if (*s!='+' && *s!='-' )
519 done=1;
520 break;
521
522 default:
523 if (isspace(Py_CHARMASK(*s))) {
524 while (*s && isspace(Py_CHARMASK(*s)))
525 s++;
526 if (s[0] != '\0')
527 sw_error=1;
528 else
529 done = 1;
530 break;
531 }
532 digit_or_dot =
533 (*s=='.' || isdigit(Py_CHARMASK(*s)));
534 if (done||!digit_or_dot) {
535 sw_error=1;
536 break;
537 }
538 errno = 0;
539 PyFPE_START_PROTECT("strtod", return 0)
540 z = strtod(s, &end) ;
541 PyFPE_END_PROTECT(z)
542 if (errno != 0) {
543 sprintf(buffer,
544 "float() out of range: %.150s", s);
545 PyErr_SetString(
546 PyExc_ValueError,
547 buffer);
548 return NULL;
549 }
550 s=end;
551 if (*s=='J' || *s=='j') {
552
553 break;
554 }
555 if (got_re) {
556 sw_error=1;
557 break;
558 }
559
560 /* accept a real part */
561 x=sign*z;
562 got_re=1;
563 if (got_im) done=1;
564 z = -1.0;
565 sign = 1;
566 break;
567
568 } /* end of switch */
569
570 } while (*s!='\0' && !sw_error);
571
572 if (sw_error) {
573 PyErr_SetString(PyExc_ValueError,
574 "malformed string for complex()");
575 return NULL;
576 }
577
578 return PyComplex_FromDoubles(x,y);
579}
580
581static PyObject *
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000582builtin_complex(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000583 PyObject *self;
584 PyObject *args;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000585{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000586 PyObject *r, *i, *tmp;
587 PyNumberMethods *nbr, *nbi = NULL;
Guido van Rossum530956d1996-07-21 02:27:43 +0000588 Py_complex cr, ci;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000589 int own_r = 0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000590
591 i = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000592 if (!PyArg_ParseTuple(args, "O|O:complex", &r, &i))
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000593 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000594 if (PyString_Check(r) || PyUnicode_Check(r))
Guido van Rossum11950231999-03-25 21:16:07 +0000595 return complex_from_string(r);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000596 if ((nbr = r->ob_type->tp_as_number) == NULL ||
Guido van Rossumc6472e91997-03-31 17:15:43 +0000597 nbr->nb_float == NULL ||
598 (i != NULL &&
599 ((nbi = i->ob_type->tp_as_number) == NULL ||
600 nbi->nb_float == NULL))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000601 PyErr_SetString(PyExc_TypeError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000602 "complex() argument can't be converted to complex");
603 return NULL;
604 }
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000605 /* XXX Hack to support classes with __complex__ method */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000606 if (PyInstance_Check(r)) {
607 static PyObject *complexstr;
608 PyObject *f;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000609 if (complexstr == NULL) {
Guido van Rossum8d751611997-01-18 08:04:16 +0000610 complexstr = PyString_InternFromString("__complex__");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000611 if (complexstr == NULL)
612 return NULL;
613 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000614 f = PyObject_GetAttr(r, complexstr);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000615 if (f == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000616 PyErr_Clear();
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000617 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000618 PyObject *args = Py_BuildValue("()");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000619 if (args == NULL)
620 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000621 r = PyEval_CallObject(f, args);
622 Py_DECREF(args);
Barry Warsawf988e681999-01-27 23:13:59 +0000623 Py_DECREF(f);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000624 if (r == NULL)
625 return NULL;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000626 own_r = 1;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000627 }
628 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000629 if (PyComplex_Check(r)) {
630 cr = ((PyComplexObject*)r)->cval;
Guido van Rossum730806d1998-04-10 22:27:42 +0000631 if (own_r) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000632 Py_DECREF(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000633 }
Guido van Rossumc6472e91997-03-31 17:15:43 +0000634 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000635 else {
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000636 tmp = (*nbr->nb_float)(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000637 if (own_r) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000638 Py_DECREF(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000639 }
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000640 if (tmp == NULL)
641 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000642 cr.real = PyFloat_AsDouble(tmp);
643 Py_DECREF(tmp);
Guido van Rossum11950231999-03-25 21:16:07 +0000644 cr.imag = 0.0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000645 }
646 if (i == NULL) {
Guido van Rossum11950231999-03-25 21:16:07 +0000647 ci.real = 0.0;
648 ci.imag = 0.0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000649 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000650 else if (PyComplex_Check(i))
651 ci = ((PyComplexObject*)i)->cval;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000652 else {
Guido van Rossumc6472e91997-03-31 17:15:43 +0000653 tmp = (*nbi->nb_float)(i);
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000654 if (tmp == NULL)
655 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000656 ci.real = PyFloat_AsDouble(tmp);
657 Py_DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000658 ci.imag = 0.;
659 }
660 cr.real -= ci.imag;
661 cr.imag += ci.real;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000662 return PyComplex_FromCComplex(cr);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000663}
664
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000665static char complex_doc[] =
666"complex(real[, imag]) -> complex number\n\
667\n\
668Create a complex number from a real part and an optional imaginary part.\n\
669This is equivalent to (real + imag*1j) where imag defaults to 0.";
670
671
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000672#endif
673
Guido van Rossum79f25d91997-04-29 20:08:16 +0000674static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000675builtin_dir(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000676 PyObject *self;
677 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000678{
Guido van Rossum666b17a1997-05-06 16:36:57 +0000679 static char *attrlist[] = {"__members__", "__methods__", NULL};
680 PyObject *v = NULL, *l = NULL, *m = NULL;
681 PyObject *d, *x;
682 int i;
683 char **s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000684
Guido van Rossum79f25d91997-04-29 20:08:16 +0000685 if (!PyArg_ParseTuple(args, "|O:dir", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000686 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000687 if (v == NULL) {
Guido van Rossum666b17a1997-05-06 16:36:57 +0000688 x = PyEval_GetLocals();
689 if (x == NULL)
690 goto error;
691 l = PyMapping_Keys(x);
692 if (l == NULL)
693 goto error;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000694 }
695 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000696 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum666b17a1997-05-06 16:36:57 +0000697 if (d == NULL)
Guido van Rossum795ba581996-05-23 22:49:07 +0000698 PyErr_Clear();
Guido van Rossum666b17a1997-05-06 16:36:57 +0000699 else {
700 l = PyMapping_Keys(d);
701 if (l == NULL)
702 PyErr_Clear();
703 Py_DECREF(d);
704 }
705 if (l == NULL) {
706 l = PyList_New(0);
707 if (l == NULL)
708 goto error;
709 }
710 for (s = attrlist; *s != NULL; s++) {
711 m = PyObject_GetAttrString(v, *s);
712 if (m == NULL) {
713 PyErr_Clear();
714 continue;
715 }
716 for (i = 0; ; i++) {
717 x = PySequence_GetItem(m, i);
718 if (x == NULL) {
719 PyErr_Clear();
720 break;
721 }
722 if (PyList_Append(l, x) != 0) {
723 Py_DECREF(x);
724 Py_DECREF(m);
725 goto error;
726 }
727 Py_DECREF(x);
728 }
729 Py_DECREF(m);
Guido van Rossum795ba581996-05-23 22:49:07 +0000730 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000731 }
Guido van Rossum666b17a1997-05-06 16:36:57 +0000732 if (PyList_Sort(l) != 0)
733 goto error;
734 return l;
735 error:
736 Py_XDECREF(l);
737 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000738}
739
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000740static char dir_doc[] =
741"dir([object]) -> list of strings\n\
742\n\
743Return an alphabetized list of names comprising (some of) the attributes\n\
744of the given object. Without an argument, the names in the current scope\n\
745are listed. With an instance argument, only the instance attributes are\n\
746returned. With a class argument, attributes of the base class are not\n\
747returned. For other types or arguments, this may list members or methods.";
748
749
Guido van Rossum79f25d91997-04-29 20:08:16 +0000750static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000751builtin_divmod(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000752 PyObject *self;
753 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000754{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000755 PyObject *v, *w;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000756
Guido van Rossum79f25d91997-04-29 20:08:16 +0000757 if (!PyArg_ParseTuple(args, "OO:divmod", &v, &w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000758 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000759 return PyNumber_Divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000760}
761
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000762static char divmod_doc[] =
763"divmod(x, y) -> (div, mod)\n\
764\n\
765Return the tuple ((x-x%y)/y, x%y). Invariant: div*y + mod == x.";
766
767
Guido van Rossum79f25d91997-04-29 20:08:16 +0000768static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000769builtin_eval(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000770 PyObject *self;
771 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000772{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000773 PyObject *cmd;
774 PyObject *globals = Py_None, *locals = Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000775 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000776
Guido van Rossum79f25d91997-04-29 20:08:16 +0000777 if (!PyArg_ParseTuple(args, "O|O!O!:eval",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000778 &cmd,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000779 &PyDict_Type, &globals,
780 &PyDict_Type, &locals))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000781 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000782 if (globals == Py_None) {
783 globals = PyEval_GetGlobals();
784 if (locals == Py_None)
785 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000786 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000787 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000788 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000789 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
790 if (PyDict_SetItemString(globals, "__builtins__",
791 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000792 return NULL;
793 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000794 if (PyCode_Check(cmd))
795 return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals);
796 if (!PyString_Check(cmd)) {
797 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000798 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000799 return NULL;
800 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000801 str = PyString_AsString(cmd);
Guido van Rossum106f2da2000-06-28 21:12:25 +0000802 if (strlen(str) != (size_t)PyString_Size(cmd)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000803 PyErr_SetString(PyExc_ValueError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000804 "embedded '\\0' in string arg");
805 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000806 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000807 while (*str == ' ' || *str == '\t')
808 str++;
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000809 return PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000810}
811
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000812static char eval_doc[] =
813"eval(source[, globals[, locals]]) -> value\n\
814\n\
815Evaluate the source in the context of globals and locals.\n\
816The source may be a string representing a Python expression\n\
817or a code object as returned by compile().\n\
818The globals and locals are dictionaries, defaulting to the current\n\
819globals and locals. If only globals is given, locals defaults to it.";
820
821
Guido van Rossum79f25d91997-04-29 20:08:16 +0000822static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000823builtin_execfile(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000824 PyObject *self;
825 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000826{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000827 char *filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000828 PyObject *globals = Py_None, *locals = Py_None;
829 PyObject *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000830 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000831
Guido van Rossum79f25d91997-04-29 20:08:16 +0000832 if (!PyArg_ParseTuple(args, "s|O!O!:execfile",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000833 &filename,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000834 &PyDict_Type, &globals,
835 &PyDict_Type, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000836 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000837 if (globals == Py_None) {
838 globals = PyEval_GetGlobals();
839 if (locals == Py_None)
840 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000841 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000842 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000843 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000844 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
845 if (PyDict_SetItemString(globals, "__builtins__",
846 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000847 return NULL;
848 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000849 Py_BEGIN_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000850 fp = fopen(filename, "r");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000851 Py_END_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000852 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000853 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000854 return NULL;
855 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000856 res = PyRun_File(fp, filename, Py_file_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000857 Py_BEGIN_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000858 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000859 Py_END_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000860 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000861}
862
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000863static char execfile_doc[] =
864"execfile(filename[, globals[, locals]])\n\
865\n\
866Read and execute a Python script from a file.\n\
867The globals and locals are dictionaries, defaulting to the current\n\
868globals and locals. If only globals is given, locals defaults to it.";
869
870
Guido van Rossum79f25d91997-04-29 20:08:16 +0000871static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +0000872builtin_getattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000873 PyObject *self;
874 PyObject *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000875{
Guido van Rossum950ff291998-06-29 13:38:57 +0000876 PyObject *v, *result, *dflt = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000877 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000878
Guido van Rossum950ff291998-06-29 13:38:57 +0000879 if (!PyArg_ParseTuple(args, "OS|O:getattr", &v, &name, &dflt))
Guido van Rossum33894be1992-01-27 16:53:09 +0000880 return NULL;
Guido van Rossum950ff291998-06-29 13:38:57 +0000881 result = PyObject_GetAttr(v, name);
882 if (result == NULL && dflt != NULL) {
883 PyErr_Clear();
884 Py_INCREF(dflt);
885 result = dflt;
886 }
887 return result;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000888}
889
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000890static char getattr_doc[] =
Guido van Rossum950ff291998-06-29 13:38:57 +0000891"getattr(object, name[, default]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000892\n\
Guido van Rossum950ff291998-06-29 13:38:57 +0000893Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\n\
894When a default argument is given, it is returned when the attribute doesn't\n\
895exist; without it, an exception is raised in that case.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000896
897
Guido van Rossum79f25d91997-04-29 20:08:16 +0000898static PyObject *
Guido van Rossum872537c1995-07-07 22:43:42 +0000899builtin_globals(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000900 PyObject *self;
901 PyObject *args;
Guido van Rossum872537c1995-07-07 22:43:42 +0000902{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000903 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +0000904
Guido van Rossum43713e52000-02-29 13:59:29 +0000905 if (!PyArg_ParseTuple(args, ":globals"))
Guido van Rossum872537c1995-07-07 22:43:42 +0000906 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000907 d = PyEval_GetGlobals();
908 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +0000909 return d;
910}
911
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000912static char globals_doc[] =
913"globals() -> dictionary\n\
914\n\
915Return the dictionary containing the current scope's global variables.";
916
917
Guido van Rossum79f25d91997-04-29 20:08:16 +0000918static PyObject *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000919builtin_hasattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000920 PyObject *self;
921 PyObject *args;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000922{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000923 PyObject *v;
924 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000925
Guido van Rossum79f25d91997-04-29 20:08:16 +0000926 if (!PyArg_ParseTuple(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000927 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000928 v = PyObject_GetAttr(v, name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000929 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000930 PyErr_Clear();
Guido van Rossum09df08a1998-05-22 00:51:39 +0000931 Py_INCREF(Py_False);
932 return Py_False;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000933 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000934 Py_DECREF(v);
Guido van Rossum09df08a1998-05-22 00:51:39 +0000935 Py_INCREF(Py_True);
936 return Py_True;
Guido van Rossum33894be1992-01-27 16:53:09 +0000937}
938
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000939static char hasattr_doc[] =
940"hasattr(object, name) -> Boolean\n\
941\n\
942Return whether the object has an attribute with the given name.\n\
943(This is done by calling getattr(object, name) and catching exceptions.)";
944
945
Guido van Rossum79f25d91997-04-29 20:08:16 +0000946static PyObject *
Guido van Rossum5b722181993-03-30 17:46:03 +0000947builtin_id(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000948 PyObject *self;
949 PyObject *args;
Guido van Rossum5b722181993-03-30 17:46:03 +0000950{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000951 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000952
Guido van Rossum79f25d91997-04-29 20:08:16 +0000953 if (!PyArg_ParseTuple(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000954 return NULL;
Guido van Rossum106f2da2000-06-28 21:12:25 +0000955 return PyLong_FromVoidPtr(v);
Guido van Rossum5b722181993-03-30 17:46:03 +0000956}
957
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000958static char id_doc[] =
959"id(object) -> integer\n\
960\n\
961Return the identity of an object. This is guaranteed to be unique among\n\
962simultaneously existing objects. (Hint: it's the object's memory address.)";
963
964
Guido van Rossum79f25d91997-04-29 20:08:16 +0000965static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000966builtin_map(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000967 PyObject *self;
968 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000969{
970 typedef struct {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000971 PyObject *seq;
972 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000973 int len;
974 } sequence;
975
Guido van Rossum79f25d91997-04-29 20:08:16 +0000976 PyObject *func, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000977 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000978 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000979 register int i, j;
980
Guido van Rossum79f25d91997-04-29 20:08:16 +0000981 n = PyTuple_Size(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000982 if (n < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000983 PyErr_SetString(PyExc_TypeError,
984 "map() requires at least two args");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000985 return NULL;
986 }
987
Guido van Rossum79f25d91997-04-29 20:08:16 +0000988 func = PyTuple_GetItem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000989 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000990
Guido van Rossumfa4ac711998-07-10 17:37:30 +0000991 if (func == Py_None && n == 1) {
992 /* map(None, S) is the same as list(S). */
993 return PySequence_List(PyTuple_GetItem(args, 1));
994 }
995
Guido van Rossum79f25d91997-04-29 20:08:16 +0000996 if ((seqs = PyMem_NEW(sequence, n)) == NULL) {
997 PyErr_NoMemory();
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000998 goto Fail_2;
999 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001000
Guido van Rossum2d951851994-08-29 12:52:16 +00001001 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001002 int curlen;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001003 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001004
Guido van Rossum79f25d91997-04-29 20:08:16 +00001005 if ((sqp->seq = PyTuple_GetItem(args, i + 1)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001006 goto Fail_2;
1007
Guido van Rossum09df08a1998-05-22 00:51:39 +00001008 sqp->sqf = sqf = sqp->seq->ob_type->tp_as_sequence;
1009 if (sqf == NULL ||
1010 sqf->sq_length == NULL ||
1011 sqf->sq_item == NULL)
1012 {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001013 static char errmsg[] =
1014 "argument %d to map() must be a sequence object";
Guido van Rossum15e33a41997-04-30 19:00:27 +00001015 char errbuf[sizeof(errmsg) + 25];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001016
1017 sprintf(errbuf, errmsg, i+2);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001018 PyErr_SetString(PyExc_TypeError, errbuf);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001019 goto Fail_2;
1020 }
1021
1022 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
1023 goto Fail_2;
1024
1025 if (curlen > len)
1026 len = curlen;
1027 }
1028
Guido van Rossum79f25d91997-04-29 20:08:16 +00001029 if ((result = (PyObject *) PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001030 goto Fail_2;
1031
Guido van Rossum2d951851994-08-29 12:52:16 +00001032 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001033 PyObject *alist, *item=NULL, *value;
Guido van Rossum2d951851994-08-29 12:52:16 +00001034 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001035
Guido van Rossum79f25d91997-04-29 20:08:16 +00001036 if (func == Py_None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +00001037 alist = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001038 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001039 if ((alist = PyTuple_New(n)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001040 goto Fail_1;
1041 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001042
1043 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +00001044 if (sqp->len < 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001045 Py_INCREF(Py_None);
1046 item = Py_None;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001047 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001048 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001049 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +00001050 if (item == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001051 if (PyErr_ExceptionMatches(
1052 PyExc_IndexError))
1053 {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001054 PyErr_Clear();
1055 Py_INCREF(Py_None);
1056 item = Py_None;
Guido van Rossum2d951851994-08-29 12:52:16 +00001057 sqp->len = -1;
1058 }
1059 else {
1060 goto Fail_0;
1061 }
1062 }
1063 else
1064 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001065
Guido van Rossum12d12c51993-10-26 17:58:25 +00001066 }
Guido van Rossum32120311995-07-10 13:52:21 +00001067 if (!alist)
Guido van Rossum2d951851994-08-29 12:52:16 +00001068 break;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001069 if (PyTuple_SetItem(alist, j, item) < 0) {
1070 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001071 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +00001072 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001073 continue;
1074
1075 Fail_0:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001076 Py_XDECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001077 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001078 }
1079
Guido van Rossum32120311995-07-10 13:52:21 +00001080 if (!alist)
1081 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +00001082
1083 if (!any) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001084 Py_DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +00001085 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001086 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001087
Guido van Rossum79f25d91997-04-29 20:08:16 +00001088 if (func == Py_None)
Guido van Rossum32120311995-07-10 13:52:21 +00001089 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001090 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001091 value = PyEval_CallObject(func, alist);
1092 Py_DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001093 if (value == NULL)
1094 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +00001095 }
1096 if (i >= len) {
Barry Warsawfa77e091999-01-28 18:49:12 +00001097 int status = PyList_Append(result, value);
Barry Warsaw21332871999-01-28 04:21:35 +00001098 Py_DECREF(value);
Barry Warsawfa77e091999-01-28 18:49:12 +00001099 if (status < 0)
1100 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +00001101 }
1102 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001103 if (PyList_SetItem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001104 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001105 }
1106 }
1107
Guido van Rossumfa4ac711998-07-10 17:37:30 +00001108 if (i < len && PyList_SetSlice(result, i, len, NULL) < 0)
1109 goto Fail_1;
1110
Guido van Rossum79f25d91997-04-29 20:08:16 +00001111 PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001112 return result;
1113
Guido van Rossum12d12c51993-10-26 17:58:25 +00001114Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001115 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001116Fail_2:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001117 if (seqs) PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001118 return NULL;
1119}
1120
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001121static char map_doc[] =
1122"map(function, sequence[, sequence, ...]) -> list\n\
1123\n\
1124Return a list of the results of applying the function to the items of\n\
1125the argument sequence(s). If more than one sequence is given, the\n\
1126function is called with an argument list consisting of the corresponding\n\
1127item of each sequence, substituting None for missing values when not all\n\
1128sequences have the same length. If the function is None, return a list of\n\
1129the items of the sequence (or a list of tuples if more than one sequence).";
1130
1131
Guido van Rossum79f25d91997-04-29 20:08:16 +00001132static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +00001133builtin_setattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001134 PyObject *self;
1135 PyObject *args;
Guido van Rossum33894be1992-01-27 16:53:09 +00001136{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001137 PyObject *v;
1138 PyObject *name;
1139 PyObject *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001140
Guido van Rossum79f25d91997-04-29 20:08:16 +00001141 if (!PyArg_ParseTuple(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +00001142 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001143 if (PyObject_SetAttr(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +00001144 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001145 Py_INCREF(Py_None);
1146 return Py_None;
Guido van Rossum33894be1992-01-27 16:53:09 +00001147}
1148
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001149static char setattr_doc[] =
1150"setattr(object, name, value)\n\
1151\n\
1152Set a named attribute on an object; setattr(x, 'y', v) is equivalent to\n\
1153``x.y = v''.";
1154
1155
Guido van Rossum79f25d91997-04-29 20:08:16 +00001156static PyObject *
Guido van Rossum14144fc1994-08-29 12:53:40 +00001157builtin_delattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001158 PyObject *self;
1159 PyObject *args;
Guido van Rossum14144fc1994-08-29 12:53:40 +00001160{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001161 PyObject *v;
1162 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001163
Guido van Rossum79f25d91997-04-29 20:08:16 +00001164 if (!PyArg_ParseTuple(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +00001165 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001166 if (PyObject_SetAttr(v, name, (PyObject *)NULL) != 0)
Guido van Rossum14144fc1994-08-29 12:53:40 +00001167 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001168 Py_INCREF(Py_None);
1169 return Py_None;
Guido van Rossum14144fc1994-08-29 12:53:40 +00001170}
1171
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001172static char delattr_doc[] =
Guido van Rossumdf12a591998-11-23 22:13:04 +00001173"delattr(object, name)\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001174\n\
1175Delete a named attribute on an object; delattr(x, 'y') is equivalent to\n\
1176``del x.y''.";
1177
1178
Guido van Rossum79f25d91997-04-29 20:08:16 +00001179static PyObject *
Guido van Rossum9bfef441993-03-29 10:43:31 +00001180builtin_hash(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001181 PyObject *self;
1182 PyObject *args;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001183{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001184 PyObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001185 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001186
Guido van Rossum79f25d91997-04-29 20:08:16 +00001187 if (!PyArg_ParseTuple(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +00001188 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001189 x = PyObject_Hash(v);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001190 if (x == -1)
1191 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001192 return PyInt_FromLong(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001193}
1194
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001195static char hash_doc[] =
1196"hash(object) -> integer\n\
1197\n\
1198Return a hash value for the object. Two objects with the same value have\n\
1199the same hash value. The reverse is not necessarily true, but likely.";
1200
1201
Guido van Rossum79f25d91997-04-29 20:08:16 +00001202static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001203builtin_hex(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001204 PyObject *self;
1205 PyObject *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001206{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001207 PyObject *v;
1208 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001209
Guido van Rossum79f25d91997-04-29 20:08:16 +00001210 if (!PyArg_ParseTuple(args, "O:hex", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001211 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001212
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001213 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001214 nb->nb_hex == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001215 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001216 "hex() argument can't be converted to hex");
1217 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001218 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001219 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001220}
1221
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001222static char hex_doc[] =
1223"hex(number) -> string\n\
1224\n\
1225Return the hexadecimal representation of an integer or long integer.";
1226
1227
Tim Petersdbd9ba62000-07-09 03:09:57 +00001228static PyObject *builtin_raw_input(PyObject *, PyObject *);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001229
Guido van Rossum79f25d91997-04-29 20:08:16 +00001230static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001231builtin_input(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001232 PyObject *self;
1233 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001234{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001235 PyObject *line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001236 char *str;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001237 PyObject *res;
1238 PyObject *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001239
1240 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001241 if (line == NULL)
1242 return line;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001243 if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001244 return NULL;
1245 while (*str == ' ' || *str == '\t')
1246 str++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001247 globals = PyEval_GetGlobals();
1248 locals = PyEval_GetLocals();
1249 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
1250 if (PyDict_SetItemString(globals, "__builtins__",
1251 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +00001252 return NULL;
1253 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00001254 res = PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001255 Py_DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001256 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001257}
1258
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001259static char input_doc[] =
1260"input([prompt]) -> value\n\
1261\n\
1262Equivalent to eval(raw_input(prompt)).";
1263
1264
Guido van Rossume8811f81997-02-14 15:48:05 +00001265static PyObject *
1266builtin_intern(self, args)
1267 PyObject *self;
1268 PyObject *args;
1269{
1270 PyObject *s;
Guido van Rossum43713e52000-02-29 13:59:29 +00001271 if (!PyArg_ParseTuple(args, "S:intern", &s))
Guido van Rossume8811f81997-02-14 15:48:05 +00001272 return NULL;
1273 Py_INCREF(s);
1274 PyString_InternInPlace(&s);
1275 return s;
1276}
1277
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001278static char intern_doc[] =
1279"intern(string) -> string\n\
1280\n\
1281``Intern'' the given string. This enters the string in the (global)\n\
1282table of interned strings whose purpose is to speed up dictionary lookups.\n\
1283Return the string itself or the previously interned string object with the\n\
1284same value.";
1285
1286
Guido van Rossum79f25d91997-04-29 20:08:16 +00001287static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001288builtin_int(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001289 PyObject *self;
1290 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001291{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001292 PyObject *v;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001293 int base = -909; /* unlikely! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001294
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001295 if (!PyArg_ParseTuple(args, "O|i:int", &v, &base))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001296 return NULL;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001297 if (base == -909)
1298 return PyNumber_Int(v);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001299 else if (PyString_Check(v))
1300 return PyInt_FromString(PyString_AS_STRING(v), NULL, base);
1301 else if (PyUnicode_Check(v))
1302 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(v),
1303 PyUnicode_GET_SIZE(v),
1304 base);
1305 else {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001306 PyErr_SetString(PyExc_TypeError,
1307 "can't convert non-string with explicit base");
1308 return NULL;
1309 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001310}
1311
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001312static char int_doc[] =
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001313"int(x[, base]) -> integer\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001314\n\
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001315Convert a string or number to an integer, if possible. A floating point\n\
1316argument will be truncated towards zero (this does not include a string\n\
1317representation of a floating point number!) When converting a string, use\n\
1318the optional base. It is an error to supply a base when converting a\n\
1319non-string.";
1320
1321
1322static PyObject *
1323builtin_long(self, args)
1324 PyObject *self;
1325 PyObject *args;
1326{
1327 PyObject *v;
1328 int base = -909; /* unlikely! */
1329
1330 if (!PyArg_ParseTuple(args, "O|i:long", &v, &base))
1331 return NULL;
1332 if (base == -909)
1333 return PyNumber_Long(v);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001334 else if (PyString_Check(v))
1335 return PyLong_FromString(PyString_AS_STRING(v), NULL, base);
1336 else if (PyUnicode_Check(v))
1337 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(v),
1338 PyUnicode_GET_SIZE(v),
1339 base);
1340 else {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001341 PyErr_SetString(PyExc_TypeError,
1342 "can't convert non-string with explicit base");
1343 return NULL;
1344 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001345}
1346
1347static char long_doc[] =
1348"long(x) -> long integer\n\
1349long(x, base) -> long integer\n\
1350\n\
1351Convert a string or number to a long integer, if possible. A floating\n\
1352point argument will be truncated towards zero (this does not include a\n\
1353string representation of a floating point number!) When converting a\n\
1354string, use the given base. It is an error to supply a base when\n\
1355converting a non-string.";
1356
1357
1358static PyObject *
1359builtin_float(self, args)
1360 PyObject *self;
1361 PyObject *args;
1362{
1363 PyObject *v;
1364
1365 if (!PyArg_ParseTuple(args, "O:float", &v))
1366 return NULL;
1367 if (PyString_Check(v))
1368 return PyFloat_FromString(v, NULL);
1369 return PyNumber_Float(v);
1370}
1371
1372static char float_doc[] =
1373"float(x) -> floating point number\n\
1374\n\
1375Convert a string or number to a floating point number, if possible.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001376
1377
Guido van Rossum79f25d91997-04-29 20:08:16 +00001378static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001379builtin_len(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001380 PyObject *self;
1381 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001382{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001383 PyObject *v;
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001384 long res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001385
Guido van Rossum79f25d91997-04-29 20:08:16 +00001386 if (!PyArg_ParseTuple(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001387 return NULL;
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001388 res = PyObject_Length(v);
1389 if (res < 0 && PyErr_Occurred())
1390 return NULL;
1391 return PyInt_FromLong(res);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001392}
1393
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001394static char len_doc[] =
1395"len(object) -> integer\n\
1396\n\
1397Return the number of items of a sequence or mapping.";
1398
1399
Guido van Rossum79f25d91997-04-29 20:08:16 +00001400static PyObject *
Guido van Rossumd1705771996-04-09 02:41:06 +00001401builtin_list(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001402 PyObject *self;
1403 PyObject *args;
Guido van Rossumd1705771996-04-09 02:41:06 +00001404{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001405 PyObject *v;
Guido van Rossumd1705771996-04-09 02:41:06 +00001406
Guido van Rossum79f25d91997-04-29 20:08:16 +00001407 if (!PyArg_ParseTuple(args, "O:list", &v))
Guido van Rossumd1705771996-04-09 02:41:06 +00001408 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001409 return PySequence_List(v);
Guido van Rossumd1705771996-04-09 02:41:06 +00001410}
1411
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001412static char list_doc[] =
1413"list(sequence) -> list\n\
1414\n\
1415Return a new list whose items are the same as those of the argument sequence.";
1416
Guido van Rossum8861b741996-07-30 16:49:37 +00001417
1418static PyObject *
1419builtin_slice(self, args)
1420 PyObject *self;
1421 PyObject *args;
1422{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001423 PyObject *start, *stop, *step;
Guido van Rossum8861b741996-07-30 16:49:37 +00001424
Guido van Rossum09df08a1998-05-22 00:51:39 +00001425 start = stop = step = NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001426
Guido van Rossum09df08a1998-05-22 00:51:39 +00001427 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
1428 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001429
Guido van Rossum09df08a1998-05-22 00:51:39 +00001430 /* This swapping of stop and start is to maintain similarity with
1431 range(). */
1432 if (stop == NULL) {
1433 stop = start;
1434 start = NULL;
1435 }
1436 return PySlice_New(start, stop, step);
Guido van Rossum8861b741996-07-30 16:49:37 +00001437}
1438
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001439static char slice_doc[] =
Fred Drake3d587441999-07-19 15:21:16 +00001440"slice([start,] stop[, step]) -> slice object\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001441\n\
1442Create a slice object. This is used for slicing by the Numeric extensions.";
1443
1444
Guido van Rossum79f25d91997-04-29 20:08:16 +00001445static PyObject *
Guido van Rossum872537c1995-07-07 22:43:42 +00001446builtin_locals(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001447 PyObject *self;
1448 PyObject *args;
Guido van Rossum872537c1995-07-07 22:43:42 +00001449{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001450 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +00001451
Guido van Rossum43713e52000-02-29 13:59:29 +00001452 if (!PyArg_ParseTuple(args, ":locals"))
Guido van Rossum872537c1995-07-07 22:43:42 +00001453 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001454 d = PyEval_GetLocals();
1455 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +00001456 return d;
1457}
1458
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001459static char locals_doc[] =
1460"locals() -> dictionary\n\
1461\n\
1462Return the dictionary containing the current scope's local variables.";
1463
1464
Guido van Rossum79f25d91997-04-29 20:08:16 +00001465static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001466min_max(args, sign)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001467 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001468 int sign;
1469{
Guido van Rossum2d951851994-08-29 12:52:16 +00001470 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001471 PyObject *v, *w, *x;
1472 PySequenceMethods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001473
Guido van Rossum79f25d91997-04-29 20:08:16 +00001474 if (PyTuple_Size(args) > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001475 v = args;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001476 else if (!PyArg_ParseTuple(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001477 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001478 sq = v->ob_type->tp_as_sequence;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001479 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001480 PyErr_SetString(PyExc_TypeError,
1481 "min() or max() of non-sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001482 return NULL;
1483 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001484 w = NULL;
1485 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001486 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +00001487 if (x == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001488 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001489 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001490 break;
1491 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001492 Py_XDECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001493 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001494 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001495 if (w == NULL)
1496 w = x;
1497 else {
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001498 int c = PyObject_Compare(x, w);
1499 if (c && PyErr_Occurred()) {
1500 Py_DECREF(x);
1501 Py_XDECREF(w);
1502 return NULL;
1503 }
1504 if (c * sign > 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001505 Py_DECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001506 w = x;
1507 }
1508 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001509 Py_DECREF(x);
Guido van Rossum2d951851994-08-29 12:52:16 +00001510 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001511 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001512 if (w == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001513 PyErr_SetString(PyExc_ValueError,
1514 "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001515 return w;
1516}
1517
Guido van Rossum79f25d91997-04-29 20:08:16 +00001518static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001519builtin_min(self, v)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001520 PyObject *self;
1521 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001522{
1523 return min_max(v, -1);
1524}
1525
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001526static char min_doc[] =
1527"min(sequence) -> value\n\
1528min(a, b, c, ...) -> value\n\
1529\n\
1530With a single sequence argument, return its smallest item.\n\
1531With two or more arguments, return the smallest argument.";
1532
1533
Guido van Rossum79f25d91997-04-29 20:08:16 +00001534static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001535builtin_max(self, v)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001536 PyObject *self;
1537 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001538{
1539 return min_max(v, 1);
1540}
1541
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001542static char max_doc[] =
1543"max(sequence) -> value\n\
1544max(a, b, c, ...) -> value\n\
1545\n\
1546With a single sequence argument, return its largest item.\n\
1547With two or more arguments, return the largest argument.";
1548
1549
Guido van Rossum79f25d91997-04-29 20:08:16 +00001550static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001551builtin_oct(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001552 PyObject *self;
1553 PyObject *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001554{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001555 PyObject *v;
1556 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001557
Guido van Rossum79f25d91997-04-29 20:08:16 +00001558 if (!PyArg_ParseTuple(args, "O:oct", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001559 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001560 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1561 nb->nb_oct == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001562 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001563 "oct() argument can't be converted to oct");
1564 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001565 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001566 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001567}
1568
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001569static char oct_doc[] =
1570"oct(number) -> string\n\
1571\n\
1572Return the octal representation of an integer or long integer.";
1573
1574
Guido van Rossum79f25d91997-04-29 20:08:16 +00001575static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +00001576builtin_open(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001577 PyObject *self;
1578 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001579{
Guido van Rossum2d951851994-08-29 12:52:16 +00001580 char *name;
1581 char *mode = "r";
1582 int bufsize = -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001583 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001584
Guido van Rossum79f25d91997-04-29 20:08:16 +00001585 if (!PyArg_ParseTuple(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001586 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001587 f = PyFile_FromString(name, mode);
Guido van Rossum2d951851994-08-29 12:52:16 +00001588 if (f != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001589 PyFile_SetBufSize(f, bufsize);
Guido van Rossum2d951851994-08-29 12:52:16 +00001590 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001591}
1592
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001593static char open_doc[] =
1594"open(filename[, mode[, buffering]]) -> file object\n\
1595\n\
1596Open a file. The mode can be 'r', 'w' or 'a' for reading (default),\n\
1597writing or appending. The file will be created if it doesn't exist\n\
1598when opened for writing or appending; it will be truncated when\n\
1599opened for writing. Add a 'b' to the mode for binary files.\n\
1600Add a '+' to the mode to allow simultaneous reading and writing.\n\
1601If the buffering argument is given, 0 means unbuffered, 1 means line\n\
1602buffered, and larger numbers specify the buffer size.";
1603
1604
Guido van Rossum79f25d91997-04-29 20:08:16 +00001605static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +00001606builtin_ord(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001607 PyObject *self;
1608 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001609{
Guido van Rossum09095f32000-03-10 23:00:52 +00001610 PyObject *obj;
1611 long ord;
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001612 int size;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001613
Guido van Rossum09095f32000-03-10 23:00:52 +00001614 if (!PyArg_ParseTuple(args, "O:ord", &obj))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001615 return NULL;
Guido van Rossum09095f32000-03-10 23:00:52 +00001616
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001617 if (PyString_Check(obj)) {
1618 size = PyString_GET_SIZE(obj);
1619 if (size == 1)
1620 ord = (long)((unsigned char)*PyString_AS_STRING(obj));
1621 } else if (PyUnicode_Check(obj)) {
1622 size = PyUnicode_GET_SIZE(obj);
1623 if (size == 1)
1624 ord = (long)*PyUnicode_AS_UNICODE(obj);
1625 } else {
1626 PyErr_Format(PyExc_TypeError,
Fred Drake078b24f2000-04-13 02:42:50 +00001627 "expected string or Unicode character, " \
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001628 "%.200s found", obj->ob_type->tp_name);
Guido van Rossum09095f32000-03-10 23:00:52 +00001629 return NULL;
1630 }
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001631 if (size == 1)
1632 return PyInt_FromLong(ord);
Guido van Rossum09095f32000-03-10 23:00:52 +00001633
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001634 PyErr_Format(PyExc_TypeError,
1635 "expected a character, length-%d string found",
1636 size);
1637 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001638}
1639
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001640static char ord_doc[] =
1641"ord(c) -> integer\n\
1642\n\
Fred Drake078b24f2000-04-13 02:42:50 +00001643Return the integer ordinal of a one character string.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001644
1645
Guido van Rossum79f25d91997-04-29 20:08:16 +00001646static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001647builtin_pow(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001648 PyObject *self;
1649 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001650{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001651 PyObject *v, *w, *z = Py_None;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001652
Guido van Rossum79f25d91997-04-29 20:08:16 +00001653 if (!PyArg_ParseTuple(args, "OO|O:pow", &v, &w, &z))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001654 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001655 return PyNumber_Power(v, w, z);
Guido van Rossumd4905451991-05-05 20:00:36 +00001656}
1657
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001658static char pow_doc[] =
1659"pow(x, y[, z]) -> number\n\
1660\n\
1661With two arguments, equivalent to x**y. With three arguments,\n\
1662equivalent to (x**y) % z, but may be more efficient (e.g. for longs).";
1663
1664
Guido van Rossum124eff01999-02-23 16:11:01 +00001665/* Return number of items in range/xrange (lo, hi, step). step > 0
1666 * required. Return a value < 0 if & only if the true value is too
1667 * large to fit in a signed long.
1668 */
1669static long
1670get_len_of_range(lo, hi, step)
1671 long lo;
1672 long hi;
1673 long step; /* must be > 0 */
1674{
1675 /* -------------------------------------------------------------
1676 If lo >= hi, the range is empty.
1677 Else if n values are in the range, the last one is
1678 lo + (n-1)*step, which must be <= hi-1. Rearranging,
1679 n <= (hi - lo - 1)/step + 1, so taking the floor of the RHS gives
1680 the proper value. Since lo < hi in this case, hi-lo-1 >= 0, so
1681 the RHS is non-negative and so truncation is the same as the
1682 floor. Letting M be the largest positive long, the worst case
1683 for the RHS numerator is hi=M, lo=-M-1, and then
1684 hi-lo-1 = M-(-M-1)-1 = 2*M. Therefore unsigned long has enough
1685 precision to compute the RHS exactly.
1686 ---------------------------------------------------------------*/
1687 long n = 0;
1688 if (lo < hi) {
1689 unsigned long uhi = (unsigned long)hi;
1690 unsigned long ulo = (unsigned long)lo;
1691 unsigned long diff = uhi - ulo - 1;
1692 n = (long)(diff / (unsigned long)step + 1);
1693 }
1694 return n;
1695}
1696
Guido van Rossum79f25d91997-04-29 20:08:16 +00001697static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001698builtin_range(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001699 PyObject *self;
1700 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001701{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001702 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum124eff01999-02-23 16:11:01 +00001703 long bign;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001704 int i, n;
Guido van Rossum124eff01999-02-23 16:11:01 +00001705
Guido van Rossum79f25d91997-04-29 20:08:16 +00001706 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001707
Guido van Rossum79f25d91997-04-29 20:08:16 +00001708 if (PyTuple_Size(args) <= 1) {
1709 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001710 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001711 &ihigh))
1712 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001713 }
1714 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001715 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001716 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001717 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001718 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001719 }
1720 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001721 PyErr_SetString(PyExc_ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001722 return NULL;
1723 }
Guido van Rossum124eff01999-02-23 16:11:01 +00001724 if (istep > 0)
1725 bign = get_len_of_range(ilow, ihigh, istep);
1726 else
1727 bign = get_len_of_range(ihigh, ilow, -istep);
1728 n = (int)bign;
1729 if (bign < 0 || (long)n != bign) {
Guido van Rossume23cde21999-01-12 05:07:47 +00001730 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum124eff01999-02-23 16:11:01 +00001731 "range() has too many items");
Guido van Rossume23cde21999-01-12 05:07:47 +00001732 return NULL;
1733 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001734 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001735 if (v == NULL)
1736 return NULL;
1737 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001738 PyObject *w = PyInt_FromLong(ilow);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001739 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001740 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001741 return NULL;
1742 }
Guido van Rossuma937d141998-04-24 18:22:02 +00001743 PyList_SET_ITEM(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001744 ilow += istep;
1745 }
1746 return v;
1747}
1748
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001749static char range_doc[] =
1750"range([start,] stop[, step]) -> list of integers\n\
1751\n\
1752Return a list containing an arithmetic progression of integers.\n\
1753range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.\n\
1754When step is given, it specifies the increment (or decrement).\n\
1755For example, range(4) returns [0, 1, 2, 3]. The end point is omitted!\n\
1756These are exactly the valid indices for a list of 4 elements.";
1757
1758
Guido van Rossum79f25d91997-04-29 20:08:16 +00001759static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001760builtin_xrange(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001761 PyObject *self;
1762 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001763{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001764 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001765 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001766
Guido van Rossum79f25d91997-04-29 20:08:16 +00001767 if (PyTuple_Size(args) <= 1) {
1768 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001769 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001770 &ihigh))
1771 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001772 }
1773 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001774 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001775 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001776 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001777 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001778 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001779 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001780 PyErr_SetString(PyExc_ValueError, "zero step for xrange()");
Guido van Rossum12d12c51993-10-26 17:58:25 +00001781 return NULL;
1782 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001783 if (istep > 0)
Guido van Rossum124eff01999-02-23 16:11:01 +00001784 n = get_len_of_range(ilow, ihigh, istep);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001785 else
Guido van Rossum124eff01999-02-23 16:11:01 +00001786 n = get_len_of_range(ihigh, ilow, -istep);
1787 if (n < 0) {
1788 PyErr_SetString(PyExc_OverflowError,
1789 "xrange() has more than sys.maxint items");
1790 return NULL;
1791 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001792 return PyRange_New(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001793}
1794
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001795static char xrange_doc[] =
1796"xrange([start,] stop[, step]) -> xrange object\n\
1797\n\
1798Like range(), but instead of returning a list, returns an object that\n\
1799generates the numbers in the range on demand. This is slightly slower\n\
1800than range() but more memory efficient.";
1801
1802
Guido van Rossum79f25d91997-04-29 20:08:16 +00001803static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001804builtin_raw_input(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001805 PyObject *self;
1806 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001807{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001808 PyObject *v = NULL;
1809 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001810
Guido van Rossum79f25d91997-04-29 20:08:16 +00001811 if (!PyArg_ParseTuple(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001812 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001813 if (PyFile_AsFile(PySys_GetObject("stdin")) == stdin &&
1814 PyFile_AsFile(PySys_GetObject("stdout")) == stdout &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001815 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001816 PyObject *po;
Guido van Rossum872537c1995-07-07 22:43:42 +00001817 char *prompt;
1818 char *s;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001819 PyObject *result;
Guido van Rossum872537c1995-07-07 22:43:42 +00001820 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001821 po = PyObject_Str(v);
Guido van Rossum872537c1995-07-07 22:43:42 +00001822 if (po == NULL)
1823 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001824 prompt = PyString_AsString(po);
Guido van Rossumd9b52081998-06-26 18:25:38 +00001825 if (prompt == NULL)
1826 return NULL;
Guido van Rossum872537c1995-07-07 22:43:42 +00001827 }
1828 else {
1829 po = NULL;
1830 prompt = "";
1831 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001832 s = PyOS_Readline(prompt);
1833 Py_XDECREF(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001834 if (s == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001835 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossum872537c1995-07-07 22:43:42 +00001836 return NULL;
1837 }
1838 if (*s == '\0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001839 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum872537c1995-07-07 22:43:42 +00001840 result = NULL;
1841 }
1842 else { /* strip trailing '\n' */
Guido van Rossum106f2da2000-06-28 21:12:25 +00001843 size_t len = strlen(s);
1844 if (len > INT_MAX) {
1845 PyErr_SetString(PyExc_OverflowError, "input too long");
1846 result = NULL;
1847 }
1848 else {
1849 result = PyString_FromStringAndSize(s, (int)(len-1));
1850 }
Guido van Rossum872537c1995-07-07 22:43:42 +00001851 }
Guido van Rossumb18618d2000-05-03 23:44:39 +00001852 PyMem_FREE(s);
Guido van Rossum872537c1995-07-07 22:43:42 +00001853 return result;
1854 }
Guido van Rossum90933611991-06-07 16:10:43 +00001855 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001856 f = PySys_GetObject("stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001857 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001858 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001859 return NULL;
1860 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001861 if (Py_FlushLine() != 0 ||
1862 PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001863 return NULL;
1864 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001865 f = PySys_GetObject("stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001866 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001867 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001868 return NULL;
1869 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001870 return PyFile_GetLine(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001871}
1872
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001873static char raw_input_doc[] =
1874"raw_input([prompt]) -> string\n\
1875\n\
1876Read a string from standard input. The trailing newline is stripped.\n\
1877If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.\n\
1878On Unix, GNU readline is used if enabled. The prompt string, if given,\n\
1879is printed without a trailing newline before reading.";
1880
1881
Guido van Rossum79f25d91997-04-29 20:08:16 +00001882static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001883builtin_reduce(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001884 PyObject *self;
1885 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001886{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001887 PyObject *seq, *func, *result = NULL;
1888 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001889 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001890
Guido van Rossum79f25d91997-04-29 20:08:16 +00001891 if (!PyArg_ParseTuple(args, "OO|O:reduce", &func, &seq, &result))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001892 return NULL;
1893 if (result != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001894 Py_INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001895
Guido van Rossum09df08a1998-05-22 00:51:39 +00001896 sqf = seq->ob_type->tp_as_sequence;
1897 if (sqf == NULL || sqf->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001898 PyErr_SetString(PyExc_TypeError,
Guido van Rossum12d12c51993-10-26 17:58:25 +00001899 "2nd argument to reduce() must be a sequence object");
1900 return NULL;
1901 }
1902
Guido van Rossum79f25d91997-04-29 20:08:16 +00001903 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001904 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001905
Guido van Rossum2d951851994-08-29 12:52:16 +00001906 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001907 PyObject *op2;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001908
1909 if (args->ob_refcnt > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001910 Py_DECREF(args);
1911 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001912 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001913 }
1914
Guido van Rossum2d951851994-08-29 12:52:16 +00001915 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001916 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001917 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001918 break;
1919 }
1920 goto Fail;
1921 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001922
Guido van Rossum2d951851994-08-29 12:52:16 +00001923 if (result == NULL)
1924 result = op2;
1925 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001926 PyTuple_SetItem(args, 0, result);
1927 PyTuple_SetItem(args, 1, op2);
1928 if ((result = PyEval_CallObject(func, args)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001929 goto Fail;
1930 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001931 }
1932
Guido van Rossum79f25d91997-04-29 20:08:16 +00001933 Py_DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001934
Guido van Rossum2d951851994-08-29 12:52:16 +00001935 if (result == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001936 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001937 "reduce of empty sequence with no initial value");
1938
Guido van Rossum12d12c51993-10-26 17:58:25 +00001939 return result;
1940
Guido van Rossum2d951851994-08-29 12:52:16 +00001941Fail:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001942 Py_XDECREF(args);
1943 Py_XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001944 return NULL;
1945}
1946
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001947static char reduce_doc[] =
1948"reduce(function, sequence[, initial]) -> value\n\
1949\n\
1950Apply a function of two arguments cumulatively to the items of a sequence,\n\
1951from left to right, so as to reduce the sequence to a single value.\n\
1952For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\
1953((((1+2)+3)+4)+5). If initial is present, it is placed before the items\n\
1954of the sequence in the calculation, and serves as a default when the\n\
1955sequence is empty.";
1956
1957
Guido van Rossum79f25d91997-04-29 20:08:16 +00001958static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001959builtin_reload(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001960 PyObject *self;
1961 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001962{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001963 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001964
Guido van Rossum79f25d91997-04-29 20:08:16 +00001965 if (!PyArg_ParseTuple(args, "O:reload", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001966 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001967 return PyImport_ReloadModule(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001968}
1969
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001970static char reload_doc[] =
1971"reload(module) -> module\n\
1972\n\
1973Reload the module. The module must have been successfully imported before.";
1974
1975
Guido van Rossum79f25d91997-04-29 20:08:16 +00001976static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001977builtin_repr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001978 PyObject *self;
1979 PyObject *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001980{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001981 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001982
Guido van Rossum79f25d91997-04-29 20:08:16 +00001983 if (!PyArg_ParseTuple(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001984 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001985 return PyObject_Repr(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001986}
1987
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001988static char repr_doc[] =
1989"repr(object) -> string\n\
1990\n\
1991Return the canonical string representation of the object.\n\
1992For most object types, eval(repr(object)) == object.";
1993
1994
Guido van Rossum79f25d91997-04-29 20:08:16 +00001995static PyObject *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001996builtin_round(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001997 PyObject *self;
1998 PyObject *args;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001999{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00002000 double x;
2001 double f;
2002 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00002003 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002004
Guido van Rossum79f25d91997-04-29 20:08:16 +00002005 if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00002006 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00002007 f = 1.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00002008 i = abs(ndigits);
2009 while (--i >= 0)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00002010 f = f*10.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00002011 if (ndigits < 0)
2012 x /= f;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00002013 else
Guido van Rossum1e162d31998-05-09 14:42:25 +00002014 x *= f;
2015 if (x >= 0.0)
2016 x = floor(x + 0.5);
2017 else
2018 x = ceil(x - 0.5);
2019 if (ndigits < 0)
2020 x *= f;
2021 else
2022 x /= f;
2023 return PyFloat_FromDouble(x);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00002024}
2025
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002026static char round_doc[] =
2027"round(number[, ndigits]) -> floating point number\n\
2028\n\
2029Round a number to a given precision in decimal digits (default 0 digits).\n\
2030This always returns a floating point number. Precision may be negative.";
2031
2032
Guido van Rossum79f25d91997-04-29 20:08:16 +00002033static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002034builtin_str(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002035 PyObject *self;
2036 PyObject *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00002037{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002038 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002039
Guido van Rossum79f25d91997-04-29 20:08:16 +00002040 if (!PyArg_ParseTuple(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00002041 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002042 return PyObject_Str(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002043}
2044
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002045static char str_doc[] =
2046"str(object) -> string\n\
2047\n\
2048Return a nice string representation of the object.\n\
2049If the argument is a string, the return value is the same object.";
2050
2051
Guido van Rossum79f25d91997-04-29 20:08:16 +00002052static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002053builtin_tuple(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002054 PyObject *self;
2055 PyObject *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00002056{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002057 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002058
Guido van Rossum79f25d91997-04-29 20:08:16 +00002059 if (!PyArg_ParseTuple(args, "O:tuple", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002060 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00002061 return PySequence_Tuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00002062}
2063
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002064static char tuple_doc[] =
2065"tuple(sequence) -> list\n\
2066\n\
2067Return a tuple whose items are the same as those of the argument sequence.\n\
2068If the argument is a tuple, the return value is the same object.";
2069
2070
Guido van Rossum79f25d91997-04-29 20:08:16 +00002071static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002072builtin_type(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002073 PyObject *self;
2074 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002075{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002076 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002077
Guido van Rossum79f25d91997-04-29 20:08:16 +00002078 if (!PyArg_ParseTuple(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002079 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002080 v = (PyObject *)v->ob_type;
2081 Py_INCREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002082 return v;
2083}
2084
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002085static char type_doc[] =
2086"type(object) -> type object\n\
2087\n\
2088Return the type of the object.";
2089
2090
Guido van Rossum79f25d91997-04-29 20:08:16 +00002091static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002092builtin_vars(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002093 PyObject *self;
2094 PyObject *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00002095{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002096 PyObject *v = NULL;
2097 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002098
Guido van Rossum79f25d91997-04-29 20:08:16 +00002099 if (!PyArg_ParseTuple(args, "|O:vars", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002100 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00002101 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002102 d = PyEval_GetLocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00002103 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002104 if (!PyErr_Occurred())
2105 PyErr_SetString(PyExc_SystemError,
2106 "no locals!?");
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00002107 }
2108 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002109 Py_INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00002110 }
2111 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002112 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum2d951851994-08-29 12:52:16 +00002113 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002114 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00002115 "vars() argument must have __dict__ attribute");
2116 return NULL;
2117 }
2118 }
2119 return d;
2120}
2121
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002122static char vars_doc[] =
2123"vars([object]) -> dictionary\n\
2124\n\
2125Without arguments, equivalent to locals().\n\
2126With an argument, equivalent to object.__dict__.";
2127
Guido van Rossum668213d1999-06-16 17:28:37 +00002128static int
2129abstract_issubclass(derived, cls, err, first)
2130 PyObject *derived;
2131 PyObject *cls;
2132 char *err;
2133 int first;
2134{
2135 static PyObject *__bases__ = NULL;
2136 PyObject *bases;
Guido van Rossum7f851861999-06-17 19:12:39 +00002137 int i, n;
Guido van Rossum668213d1999-06-16 17:28:37 +00002138 int r = 0;
2139
2140 if (__bases__ == NULL) {
2141 __bases__ = PyString_FromString("__bases__");
2142 if (__bases__ == NULL)
2143 return -1;
2144 }
2145
2146 if (first) {
2147 bases = PyObject_GetAttr(cls, __bases__);
2148 if (bases == NULL || !PyTuple_Check(bases)) {
2149 Py_XDECREF(bases);
2150 PyErr_SetString(PyExc_TypeError, err);
2151 return -1;
2152 }
2153 Py_DECREF(bases);
2154 }
2155
2156 if (derived == cls)
2157 return 1;
2158
2159 bases = PyObject_GetAttr(derived, __bases__);
2160 if (bases == NULL || !PyTuple_Check(bases)) {
2161 Py_XDECREF(bases);
2162 PyErr_SetString(PyExc_TypeError, err);
2163 return -1;
2164 }
2165
2166 n = PyTuple_GET_SIZE(bases);
2167 for (i = 0; i < n; i++) {
2168 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i),
2169 cls, err, 0);
2170 if (r != 0)
2171 break;
2172 }
2173
2174 Py_DECREF(bases);
2175
2176 return r;
2177}
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002178
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002179static PyObject *
2180builtin_isinstance(self, args)
2181 PyObject *self;
2182 PyObject *args;
2183{
2184 PyObject *inst;
2185 PyObject *cls;
Guido van Rossum668213d1999-06-16 17:28:37 +00002186 PyObject *icls;
2187 static PyObject *__class__ = NULL;
2188 int retval = 0;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002189
Guido van Rossum43713e52000-02-29 13:59:29 +00002190 if (!PyArg_ParseTuple(args, "OO:isinstance", &inst, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002191 return NULL;
Guido van Rossumf5dd9141997-12-02 19:11:45 +00002192
Guido van Rossum668213d1999-06-16 17:28:37 +00002193 if (PyClass_Check(cls)) {
2194 if (PyInstance_Check(inst)) {
Guido van Rossumf5dd9141997-12-02 19:11:45 +00002195 PyObject *inclass =
2196 (PyObject*)((PyInstanceObject*)inst)->in_class;
2197 retval = PyClass_IsSubclass(inclass, cls);
2198 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002199 }
Guido van Rossum668213d1999-06-16 17:28:37 +00002200 else if (PyType_Check(cls)) {
2201 retval = ((PyObject *)(inst->ob_type) == cls);
2202 }
2203 else if (!PyInstance_Check(inst)) {
2204 if (__class__ == NULL) {
2205 __class__ = PyString_FromString("__class__");
2206 if (__class__ == NULL)
2207 return NULL;
2208 }
2209 icls = PyObject_GetAttr(inst, __class__);
2210 if (icls != NULL) {
2211 retval = abstract_issubclass(
2212 icls, cls,
2213 "second argument must be a class",
2214 1);
2215 Py_DECREF(icls);
2216 if (retval < 0)
2217 return NULL;
2218 }
2219 else {
2220 PyErr_SetString(PyExc_TypeError,
2221 "second argument must be a class");
2222 return NULL;
2223 }
2224 }
2225 else {
2226 PyErr_SetString(PyExc_TypeError,
2227 "second argument must be a class");
2228 return NULL;
2229 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002230 return PyInt_FromLong(retval);
2231}
2232
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002233static char isinstance_doc[] =
2234"isinstance(object, class-or-type) -> Boolean\n\
2235\n\
2236Return whether an object is an instance of a class or of a subclass thereof.\n\
2237With a type as second argument, return whether that is the object's type.";
2238
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002239
2240static PyObject *
2241builtin_issubclass(self, args)
2242 PyObject *self;
2243 PyObject *args;
2244{
2245 PyObject *derived;
2246 PyObject *cls;
2247 int retval;
2248
Guido van Rossum43713e52000-02-29 13:59:29 +00002249 if (!PyArg_ParseTuple(args, "OO:issubclass", &derived, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002250 return NULL;
Guido van Rossum668213d1999-06-16 17:28:37 +00002251
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002252 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossum668213d1999-06-16 17:28:37 +00002253 retval = abstract_issubclass(
2254 derived, cls, "arguments must be classes", 1);
2255 if (retval < 0)
2256 return NULL;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002257 }
Guido van Rossum668213d1999-06-16 17:28:37 +00002258 else {
2259 /* shortcut */
2260 if (!(retval = (derived == cls)))
2261 retval = PyClass_IsSubclass(derived, cls);
2262 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002263
2264 return PyInt_FromLong(retval);
2265}
2266
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002267static char issubclass_doc[] =
2268"issubclass(C, B) -> Boolean\n\
2269\n\
2270Return whether class C is a subclass (i.e., a derived class) of class B.";
2271
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002272
Guido van Rossum79f25d91997-04-29 20:08:16 +00002273static PyMethodDef builtin_methods[] = {
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002274 {"__import__", builtin___import__, 1, import_doc},
2275 {"abs", builtin_abs, 1, abs_doc},
2276 {"apply", builtin_apply, 1, apply_doc},
Guido van Rossum0daf0221999-03-19 19:07:19 +00002277 {"buffer", builtin_buffer, 1, buffer_doc},
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002278 {"callable", builtin_callable, 1, callable_doc},
2279 {"chr", builtin_chr, 1, chr_doc},
2280 {"cmp", builtin_cmp, 1, cmp_doc},
2281 {"coerce", builtin_coerce, 1, coerce_doc},
2282 {"compile", builtin_compile, 1, compile_doc},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00002283#ifndef WITHOUT_COMPLEX
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002284 {"complex", builtin_complex, 1, complex_doc},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00002285#endif
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002286 {"delattr", builtin_delattr, 1, delattr_doc},
2287 {"dir", builtin_dir, 1, dir_doc},
2288 {"divmod", builtin_divmod, 1, divmod_doc},
2289 {"eval", builtin_eval, 1, eval_doc},
2290 {"execfile", builtin_execfile, 1, execfile_doc},
2291 {"filter", builtin_filter, 1, filter_doc},
2292 {"float", builtin_float, 1, float_doc},
2293 {"getattr", builtin_getattr, 1, getattr_doc},
2294 {"globals", builtin_globals, 1, globals_doc},
2295 {"hasattr", builtin_hasattr, 1, hasattr_doc},
2296 {"hash", builtin_hash, 1, hash_doc},
2297 {"hex", builtin_hex, 1, hex_doc},
2298 {"id", builtin_id, 1, id_doc},
2299 {"input", builtin_input, 1, input_doc},
2300 {"intern", builtin_intern, 1, intern_doc},
2301 {"int", builtin_int, 1, int_doc},
2302 {"isinstance", builtin_isinstance, 1, isinstance_doc},
2303 {"issubclass", builtin_issubclass, 1, issubclass_doc},
2304 {"len", builtin_len, 1, len_doc},
2305 {"list", builtin_list, 1, list_doc},
2306 {"locals", builtin_locals, 1, locals_doc},
2307 {"long", builtin_long, 1, long_doc},
2308 {"map", builtin_map, 1, map_doc},
2309 {"max", builtin_max, 1, max_doc},
2310 {"min", builtin_min, 1, min_doc},
2311 {"oct", builtin_oct, 1, oct_doc},
2312 {"open", builtin_open, 1, open_doc},
2313 {"ord", builtin_ord, 1, ord_doc},
2314 {"pow", builtin_pow, 1, pow_doc},
2315 {"range", builtin_range, 1, range_doc},
2316 {"raw_input", builtin_raw_input, 1, raw_input_doc},
2317 {"reduce", builtin_reduce, 1, reduce_doc},
2318 {"reload", builtin_reload, 1, reload_doc},
2319 {"repr", builtin_repr, 1, repr_doc},
2320 {"round", builtin_round, 1, round_doc},
2321 {"setattr", builtin_setattr, 1, setattr_doc},
2322 {"slice", builtin_slice, 1, slice_doc},
2323 {"str", builtin_str, 1, str_doc},
2324 {"tuple", builtin_tuple, 1, tuple_doc},
2325 {"type", builtin_type, 1, type_doc},
Guido van Rossum09095f32000-03-10 23:00:52 +00002326 {"unicode", builtin_unicode, 1, unicode_doc},
2327 {"unichr", builtin_unichr, 1, unichr_doc},
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002328 {"vars", builtin_vars, 1, vars_doc},
2329 {"xrange", builtin_xrange, 1, xrange_doc},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00002330 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00002331};
2332
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002333static char builtin_doc[] =
2334"Built-in functions, exceptions, and other objects.\n\
2335\n\
2336Noteworthy: None is the `nil' object; Ellipsis represents `...' in slices.";
2337
Guido van Rossum25ce5661997-08-02 03:10:38 +00002338PyObject *
Barry Warsaw78e6c672000-05-25 23:15:05 +00002339_PyBuiltin_Init()
Guido van Rossum25ce5661997-08-02 03:10:38 +00002340{
Fred Drake5550de32000-06-20 04:54:19 +00002341 PyObject *mod, *dict, *debug;
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002342 mod = Py_InitModule4("__builtin__", builtin_methods,
2343 builtin_doc, (PyObject *)NULL,
2344 PYTHON_API_VERSION);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002345 if (mod == NULL)
2346 return NULL;
2347 dict = PyModule_GetDict(mod);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002348 if (PyDict_SetItemString(dict, "None", Py_None) < 0)
2349 return NULL;
2350 if (PyDict_SetItemString(dict, "Ellipsis", Py_Ellipsis) < 0)
2351 return NULL;
Fred Drake5550de32000-06-20 04:54:19 +00002352 debug = PyInt_FromLong(Py_OptimizeFlag == 0);
2353 if (PyDict_SetItemString(dict, "__debug__", debug) < 0) {
2354 Py_XDECREF(debug);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002355 return NULL;
Fred Drake5550de32000-06-20 04:54:19 +00002356 }
2357 Py_XDECREF(debug);
Barry Warsaw757af0e1997-08-29 22:13:51 +00002358
Guido van Rossum25ce5661997-08-02 03:10:38 +00002359 return mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002360}
2361
Guido van Rossume77a7571993-11-03 15:01:26 +00002362/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00002363
Guido van Rossum79f25d91997-04-29 20:08:16 +00002364static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00002365filtertuple(func, tuple)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002366 PyObject *func;
2367 PyObject *tuple;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002368{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002369 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002370 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002371 int len = PyTuple_Size(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002372
Guido van Rossumb7b45621995-08-04 04:07:45 +00002373 if (len == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002374 Py_INCREF(tuple);
Guido van Rossumb7b45621995-08-04 04:07:45 +00002375 return tuple;
2376 }
2377
Guido van Rossum79f25d91997-04-29 20:08:16 +00002378 if ((result = PyTuple_New(len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00002379 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002380
Guido van Rossum12d12c51993-10-26 17:58:25 +00002381 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002382 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002383 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002384
Guido van Rossum79f25d91997-04-29 20:08:16 +00002385 if ((item = PyTuple_GetItem(tuple, i)) == NULL)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002386 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002387 if (func == Py_None) {
2388 Py_INCREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002389 good = item;
2390 }
2391 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002392 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002393 if (arg == NULL)
2394 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002395 good = PyEval_CallObject(func, arg);
2396 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002397 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002398 goto Fail_1;
2399 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002400 ok = PyObject_IsTrue(good);
2401 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002402 if (ok) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002403 Py_INCREF(item);
2404 if (PyTuple_SetItem(result, j++, item) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002405 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002406 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00002407 }
2408
Guido van Rossum79f25d91997-04-29 20:08:16 +00002409 if (_PyTuple_Resize(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002410 return NULL;
2411
Guido van Rossum12d12c51993-10-26 17:58:25 +00002412 return result;
2413
Guido van Rossum12d12c51993-10-26 17:58:25 +00002414Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002415 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002416 return NULL;
2417}
2418
2419
Guido van Rossume77a7571993-11-03 15:01:26 +00002420/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00002421
Guido van Rossum79f25d91997-04-29 20:08:16 +00002422static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00002423filterstring(func, strobj)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002424 PyObject *func;
2425 PyObject *strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002426{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002427 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002428 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002429 int len = PyString_Size(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002430
Guido van Rossum79f25d91997-04-29 20:08:16 +00002431 if (func == Py_None) {
Guido van Rossum2586bf01993-11-01 16:21:44 +00002432 /* No character is ever false -- share input string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002433 Py_INCREF(strobj);
Guido van Rossum2d951851994-08-29 12:52:16 +00002434 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002435 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002436 if ((result = PyString_FromStringAndSize(NULL, len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00002437 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002438
Guido van Rossum12d12c51993-10-26 17:58:25 +00002439 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002440 PyObject *item, *arg, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002441 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002442
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002443 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
2444 if (item == NULL)
2445 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002446 arg = Py_BuildValue("(O)", item);
2447 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002448 if (arg == NULL)
2449 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002450 good = PyEval_CallObject(func, arg);
2451 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002452 if (good == NULL)
2453 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002454 ok = PyObject_IsTrue(good);
2455 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002456 if (ok)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002457 PyString_AS_STRING((PyStringObject *)result)[j++] =
2458 PyString_AS_STRING((PyStringObject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00002459 }
2460
Guido van Rossum79f25d91997-04-29 20:08:16 +00002461 if (j < len && _PyString_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002462 return NULL;
2463
Guido van Rossum12d12c51993-10-26 17:58:25 +00002464 return result;
2465
Guido van Rossum12d12c51993-10-26 17:58:25 +00002466Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002467 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002468 return NULL;
2469}