blob: ea1269ed9ea68b891815e5f4c29419817e50712a [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 Rossum6bf62da1997-04-11 20:37:35 +000019#include <ctype.h>
20
Guido van Rossum1a2c5cb1996-12-10 15:37:36 +000021#ifdef HAVE_UNISTD_H
22#include <unistd.h>
23#endif
Jack Jansen41aa8e52000-07-03 21:39:47 +000024#ifdef HAVE_LIMITS_H
25#include <limits.h>
26#endif
Guido van Rossum1a2c5cb1996-12-10 15:37:36 +000027
Guido van Rossum12d12c51993-10-26 17:58:25 +000028/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000029static PyObject *filterstring(PyObject *, PyObject *);
30static PyObject *filtertuple (PyObject *, PyObject *);
Guido van Rossum12d12c51993-10-26 17:58:25 +000031
Guido van Rossum79f25d91997-04-29 20:08:16 +000032static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000033builtin___import__(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +000034{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000035 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +000036 PyObject *globals = NULL;
37 PyObject *locals = NULL;
38 PyObject *fromlist = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000039
Guido van Rossum79f25d91997-04-29 20:08:16 +000040 if (!PyArg_ParseTuple(args, "s|OOO:__import__",
Guido van Rossum24c13741995-02-14 09:42:43 +000041 &name, &globals, &locals, &fromlist))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000042 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +000043 return PyImport_ImportModuleEx(name, globals, locals, fromlist);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000044}
45
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +000046static char import_doc[] =
47"__import__(name, globals, locals, fromlist) -> module\n\
48\n\
49Import a module. The globals are only used to determine the context;\n\
50they are not modified. The locals are currently unused. The fromlist\n\
51should be a list of names to emulate ``from name import ...'', or an\n\
52empty list to emulate ``import name''.\n\
53When importing a module from a package, note that __import__('A.B', ...)\n\
54returns package A when fromlist is empty, but its submodule B when\n\
55fromlist is not empty.";
56
Guido van Rossum1ae940a1995-01-02 19:04:15 +000057
Guido van Rossum79f25d91997-04-29 20:08:16 +000058static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000059builtin_abs(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000060{
Guido van Rossum79f25d91997-04-29 20:08:16 +000061 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000062
Guido van Rossum79f25d91997-04-29 20:08:16 +000063 if (!PyArg_ParseTuple(args, "O:abs", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000064 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +000065 return PyNumber_Absolute(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000066}
67
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +000068static char abs_doc[] =
69"abs(number) -> number\n\
70\n\
71Return the absolute value of the argument.";
72
73
Guido van Rossum79f25d91997-04-29 20:08:16 +000074static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000075builtin_apply(PyObject *self, PyObject *args)
Guido van Rossumc02e15c1991-12-16 13:03:00 +000076{
Guido van Rossum79f25d91997-04-29 20:08:16 +000077 PyObject *func, *alist = NULL, *kwdict = NULL;
Barry Warsaw968f8cb1998-10-01 15:33:12 +000078 PyObject *t = NULL, *retval = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000079
Guido van Rossum79f25d91997-04-29 20:08:16 +000080 if (!PyArg_ParseTuple(args, "O|OO:apply", &func, &alist, &kwdict))
Guido van Rossumc02e15c1991-12-16 13:03:00 +000081 return NULL;
Barry Warsaw968f8cb1998-10-01 15:33:12 +000082 if (alist != NULL) {
83 if (!PyTuple_Check(alist)) {
84 if (!PySequence_Check(alist)) {
85 PyErr_SetString(PyExc_TypeError,
86 "apply() 2nd argument must be a sequence");
87 return NULL;
88 }
89 t = PySequence_Tuple(alist);
90 if (t == NULL)
91 return NULL;
92 alist = t;
93 }
Guido van Rossum2d951851994-08-29 12:52:16 +000094 }
Guido van Rossum79f25d91997-04-29 20:08:16 +000095 if (kwdict != NULL && !PyDict_Check(kwdict)) {
96 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +000097 "apply() 3rd argument must be dictionary");
Barry Warsaw968f8cb1998-10-01 15:33:12 +000098 goto finally;
Guido van Rossum681d79a1995-07-18 14:51:37 +000099 }
Barry Warsaw968f8cb1998-10-01 15:33:12 +0000100 retval = PyEval_CallObjectWithKeywords(func, alist, kwdict);
101 finally:
102 Py_XDECREF(t);
103 return retval;
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000104}
105
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000106static char apply_doc[] =
Fred Drake7b912121999-12-23 14:16:55 +0000107"apply(object, args[, kwargs]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000108\n\
Fred Drake7b912121999-12-23 14:16:55 +0000109Call a callable object with positional arguments taken from the tuple args,\n\
110and keyword arguments taken from the optional dictionary kwargs.\n\
111Note that classes are callable, as are instances with a __call__() method.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000112
113
Guido van Rossum79f25d91997-04-29 20:08:16 +0000114static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000115builtin_buffer(PyObject *self, PyObject *args)
Guido van Rossum0daf0221999-03-19 19:07:19 +0000116{
117 PyObject *ob;
118 int offset = 0;
119 int size = Py_END_OF_BUFFER;
120
121 if ( !PyArg_ParseTuple(args, "O|ii:buffer", &ob, &offset, &size) )
122 return NULL;
123 return PyBuffer_FromObject(ob, offset, size);
124}
125
126static char buffer_doc[] =
Guido van Rossum09095f32000-03-10 23:00:52 +0000127"buffer(object [, offset[, size]]) -> object\n\
Guido van Rossum0daf0221999-03-19 19:07:19 +0000128\n\
129Creates a new buffer object which references the given object.\n\
130The buffer will reference a slice of the target object from the\n\
131start of the object (or at the specified offset). The slice will\n\
132extend to the end of the target object (or with the specified size).";
133
134
135static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000136builtin_unicode(PyObject *self, PyObject *args)
Guido van Rossum09095f32000-03-10 23:00:52 +0000137{
Guido van Rossum3afba762000-04-11 15:38:23 +0000138 PyObject *v;
Guido van Rossum09095f32000-03-10 23:00:52 +0000139 char *encoding = NULL;
140 char *errors = NULL;
141
Guido van Rossum3afba762000-04-11 15:38:23 +0000142 if ( !PyArg_ParseTuple(args, "O|ss:unicode", &v, &encoding, &errors) )
Guido van Rossum09095f32000-03-10 23:00:52 +0000143 return NULL;
Marc-André Lemburg1b1bcc92000-07-07 13:48:25 +0000144 return PyUnicode_FromEncodedObject(v, encoding, errors);
Guido van Rossum09095f32000-03-10 23:00:52 +0000145}
146
147static char unicode_doc[] =
148"unicode(string [, encoding[, errors]]) -> object\n\
149\n\
Fred Drake078b24f2000-04-13 02:42:50 +0000150Creates a new Unicode object from the given encoded string.\n\
Fred Drakec640b182000-05-09 19:55:16 +0000151encoding defaults to the current default string encoding and \n\
152errors, defining the error handling, to 'strict'.";
Guido van Rossum09095f32000-03-10 23:00:52 +0000153
154
155static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000156builtin_callable(PyObject *self, PyObject *args)
Guido van Rossum2d951851994-08-29 12:52:16 +0000157{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000158 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000159
Guido van Rossum79f25d91997-04-29 20:08:16 +0000160 if (!PyArg_ParseTuple(args, "O:callable", &v))
Guido van Rossum2d951851994-08-29 12:52:16 +0000161 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000162 return PyInt_FromLong((long)PyCallable_Check(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000163}
164
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000165static char callable_doc[] =
166"callable(object) -> Boolean\n\
167\n\
168Return whether the object is callable (i.e., some kind of function).\n\
169Note that classes are callable, as are instances with a __call__() method.";
170
171
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000173builtin_filter(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000174{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000175 PyObject *func, *seq, *result;
176 PySequenceMethods *sqf;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000177 int len;
178 register int i, j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000179
Guido van Rossum79f25d91997-04-29 20:08:16 +0000180 if (!PyArg_ParseTuple(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000181 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000182
Guido van Rossum79f25d91997-04-29 20:08:16 +0000183 if (PyString_Check(seq)) {
184 PyObject *r = filterstring(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000185 return r;
186 }
187
Guido van Rossum79f25d91997-04-29 20:08:16 +0000188 if (PyTuple_Check(seq)) {
189 PyObject *r = filtertuple(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000190 return r;
191 }
192
Guido van Rossum09df08a1998-05-22 00:51:39 +0000193 sqf = seq->ob_type->tp_as_sequence;
194 if (sqf == NULL || sqf->sq_length == NULL || sqf->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000195 PyErr_SetString(PyExc_TypeError,
Guido van Rossume77a7571993-11-03 15:01:26 +0000196 "argument 2 to filter() must be a sequence type");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000197 goto Fail_2;
198 }
199
200 if ((len = (*sqf->sq_length)(seq)) < 0)
201 goto Fail_2;
202
Guido van Rossum79f25d91997-04-29 20:08:16 +0000203 if (PyList_Check(seq) && seq->ob_refcnt == 1) {
204 Py_INCREF(seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000205 result = seq;
206 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000207 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000208 if ((result = PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000209 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000210 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000211
Guido van Rossum2d951851994-08-29 12:52:16 +0000212 for (i = j = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000213 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000214 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000215
Guido van Rossum2d951851994-08-29 12:52:16 +0000216 if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +0000217 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000218 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +0000219 break;
220 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000221 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000222 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000223
Guido van Rossum79f25d91997-04-29 20:08:16 +0000224 if (func == Py_None) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000225 good = item;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 Py_INCREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000227 }
228 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000229 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000230 if (arg == NULL)
231 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000232 good = PyEval_CallObject(func, arg);
233 Py_DECREF(arg);
Guido van Rossum58b68731995-01-10 17:40:55 +0000234 if (good == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000235 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000236 goto Fail_1;
Guido van Rossum58b68731995-01-10 17:40:55 +0000237 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000238 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000239 ok = PyObject_IsTrue(good);
240 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000241 if (ok) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000242 if (j < len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000243 if (PyList_SetItem(result, j++, item) < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000244 goto Fail_1;
245 }
246 else {
Barry Warsawfa77e091999-01-28 18:49:12 +0000247 int status = PyList_Append(result, item);
Guido van Rossum2d951851994-08-29 12:52:16 +0000248 j++;
Barry Warsawfa77e091999-01-28 18:49:12 +0000249 Py_DECREF(item);
250 if (status < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000251 goto Fail_1;
252 }
Guido van Rossum58b68731995-01-10 17:40:55 +0000253 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000254 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000255 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000256 }
257
Guido van Rossum12d12c51993-10-26 17:58:25 +0000258
Guido van Rossum79f25d91997-04-29 20:08:16 +0000259 if (j < len && PyList_SetSlice(result, j, len, NULL) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000260 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000261
Guido van Rossum12d12c51993-10-26 17:58:25 +0000262 return result;
263
Guido van Rossum12d12c51993-10-26 17:58:25 +0000264Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000265 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000266Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000267 return NULL;
268}
269
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000270static char filter_doc[] =
271"filter(function, sequence) -> list\n\
272\n\
273Return a list containing those items of sequence for which function(item)\n\
274is true. If function is None, return a list of items that are true.";
275
276
Guido van Rossum79f25d91997-04-29 20:08:16 +0000277static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000278builtin_chr(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000279{
280 long x;
281 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000282
Guido van Rossum79f25d91997-04-29 20:08:16 +0000283 if (!PyArg_ParseTuple(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000284 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000285 if (x < 0 || x >= 256) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000286 PyErr_SetString(PyExc_ValueError,
287 "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000288 return NULL;
289 }
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000290 s[0] = (char)x;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000291 return PyString_FromStringAndSize(s, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000292}
293
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000294static char chr_doc[] =
295"chr(i) -> character\n\
296\n\
297Return a string of one character with ordinal i; 0 <= i < 256.";
298
299
Guido van Rossum79f25d91997-04-29 20:08:16 +0000300static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000301builtin_unichr(PyObject *self, PyObject *args)
Guido van Rossum09095f32000-03-10 23:00:52 +0000302{
303 long x;
304 Py_UNICODE s[1];
305
306 if (!PyArg_ParseTuple(args, "l:unichr", &x))
307 return NULL;
308 if (x < 0 || x >= 65536) {
309 PyErr_SetString(PyExc_ValueError,
310 "unichr() arg not in range(65536)");
311 return NULL;
312 }
313 s[0] = (Py_UNICODE)x;
314 return PyUnicode_FromUnicode(s, 1);
315}
316
317static char unichr_doc[] =
Fred Drake078b24f2000-04-13 02:42:50 +0000318"unichr(i) -> Unicode character\n\
Guido van Rossum09095f32000-03-10 23:00:52 +0000319\n\
Fred Drake078b24f2000-04-13 02:42:50 +0000320Return a Unicode string of one character with ordinal i; 0 <= i < 65536.";
Guido van Rossum09095f32000-03-10 23:00:52 +0000321
322
323static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000324builtin_cmp(PyObject *self, PyObject *args)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000325{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000326 PyObject *a, *b;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000327 int c;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000328
Guido van Rossum79f25d91997-04-29 20:08:16 +0000329 if (!PyArg_ParseTuple(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000330 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000331 if (PyObject_Cmp(a, b, &c) < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000332 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000333 return PyInt_FromLong((long)c);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000334}
335
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000336static char cmp_doc[] =
337"cmp(x, y) -> integer\n\
338\n\
339Return negative if x<y, zero if x==y, positive if x>y.";
340
341
Guido van Rossum79f25d91997-04-29 20:08:16 +0000342static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000343builtin_coerce(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000344{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000345 PyObject *v, *w;
346 PyObject *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000347
Guido van Rossum79f25d91997-04-29 20:08:16 +0000348 if (!PyArg_ParseTuple(args, "OO:coerce", &v, &w))
Guido van Rossum5524a591995-01-10 15:26:20 +0000349 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000350 if (PyNumber_Coerce(&v, &w) < 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000351 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000352 res = Py_BuildValue("(OO)", v, w);
353 Py_DECREF(v);
354 Py_DECREF(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000355 return res;
356}
357
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000358static char coerce_doc[] =
359"coerce(x, y) -> None or (x1, y1)\n\
360\n\
361When x and y can be coerced to values of the same type, return a tuple\n\
362containing the coerced values. When they can't be coerced, return None.";
363
364
Guido van Rossum79f25d91997-04-29 20:08:16 +0000365static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000366builtin_compile(PyObject *self, PyObject *args)
Guido van Rossum5b722181993-03-30 17:46:03 +0000367{
368 char *str;
369 char *filename;
370 char *startstr;
371 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000372
Guido van Rossum79f25d91997-04-29 20:08:16 +0000373 if (!PyArg_ParseTuple(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000374 return NULL;
375 if (strcmp(startstr, "exec") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000376 start = Py_file_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000377 else if (strcmp(startstr, "eval") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000378 start = Py_eval_input;
Guido van Rossum872537c1995-07-07 22:43:42 +0000379 else if (strcmp(startstr, "single") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000380 start = Py_single_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000381 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000382 PyErr_SetString(PyExc_ValueError,
Guido van Rossum872537c1995-07-07 22:43:42 +0000383 "compile() mode must be 'exec' or 'eval' or 'single'");
Guido van Rossum5b722181993-03-30 17:46:03 +0000384 return NULL;
385 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000386 return Py_CompileString(str, filename, start);
Guido van Rossum5b722181993-03-30 17:46:03 +0000387}
388
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000389static char compile_doc[] =
390"compile(source, filename, mode) -> code object\n\
391\n\
392Compile the source string (a Python module, statement or expression)\n\
393into a code object that can be executed by the exec statement or eval().\n\
394The filename will be used for run-time error messages.\n\
395The mode must be 'exec' to compile a module, 'single' to compile a\n\
396single (interactive) statement, or 'eval' to compile an expression.";
397
398
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000399#ifndef WITHOUT_COMPLEX
400
Guido van Rossum79f25d91997-04-29 20:08:16 +0000401static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000402complex_from_string(PyObject *v)
Guido van Rossum11950231999-03-25 21:16:07 +0000403{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000404 extern double strtod(const char *, char **);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000405 const char *s, *start;
406 char *end;
Guido van Rossum11950231999-03-25 21:16:07 +0000407 double x=0.0, y=0.0, z;
408 int got_re=0, got_im=0, done=0;
409 int digit_or_dot;
410 int sw_error=0;
411 int sign;
412 char buffer[256]; /* For errors */
Barry Warsaw5ca1ef92000-08-18 05:02:16 +0000413 char s_buffer[256];
Guido van Rossum9e896b32000-04-05 20:11:21 +0000414 int len;
Guido van Rossum11950231999-03-25 21:16:07 +0000415
Guido van Rossum9e896b32000-04-05 20:11:21 +0000416 if (PyString_Check(v)) {
417 s = PyString_AS_STRING(v);
418 len = PyString_GET_SIZE(v);
419 }
420 else if (PyUnicode_Check(v)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000421 if (PyUnicode_GET_SIZE(v) >= sizeof(s_buffer)) {
422 PyErr_SetString(PyExc_ValueError,
423 "complex() literal too large to convert");
424 return NULL;
425 }
426 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
427 PyUnicode_GET_SIZE(v),
428 s_buffer,
429 NULL))
430 return NULL;
431 s = s_buffer;
Trent Mick29b83812000-08-12 21:35:36 +0000432 len = (int)strlen(s);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000433 }
434 else if (PyObject_AsCharBuffer(v, &s, &len)) {
435 PyErr_SetString(PyExc_TypeError,
436 "complex() needs a string first argument");
437 return NULL;
438 }
Guido van Rossum11950231999-03-25 21:16:07 +0000439
440 /* position on first nonblank */
Guido van Rossum9e896b32000-04-05 20:11:21 +0000441 start = s;
Guido van Rossum11950231999-03-25 21:16:07 +0000442 while (*s && isspace(Py_CHARMASK(*s)))
443 s++;
444 if (s[0] == '\0') {
445 PyErr_SetString(PyExc_ValueError,
446 "empty string for complex()");
447 return NULL;
448 }
449
450 z = -1.0;
451 sign = 1;
452 do {
453
454 switch (*s) {
455
456 case '\0':
Guido van Rossum9e896b32000-04-05 20:11:21 +0000457 if (s-start != len) {
Guido van Rossum11950231999-03-25 21:16:07 +0000458 PyErr_SetString(
459 PyExc_ValueError,
460 "null byte in argument for complex()");
461 return NULL;
462 }
463 if(!done) sw_error=1;
464 break;
465
466 case '-':
467 sign = -1;
468 /* Fallthrough */
469 case '+':
470 if (done) sw_error=1;
471 s++;
472 if ( *s=='\0'||*s=='+'||*s=='-' ||
473 isspace(Py_CHARMASK(*s)) ) sw_error=1;
474 break;
475
476 case 'J':
477 case 'j':
478 if (got_im || done) {
479 sw_error = 1;
480 break;
481 }
482 if (z<0.0) {
483 y=sign;
484 }
485 else{
486 y=sign*z;
487 }
488 got_im=1;
489 s++;
490 if (*s!='+' && *s!='-' )
491 done=1;
492 break;
493
494 default:
495 if (isspace(Py_CHARMASK(*s))) {
496 while (*s && isspace(Py_CHARMASK(*s)))
497 s++;
498 if (s[0] != '\0')
499 sw_error=1;
500 else
501 done = 1;
502 break;
503 }
504 digit_or_dot =
505 (*s=='.' || isdigit(Py_CHARMASK(*s)));
506 if (done||!digit_or_dot) {
507 sw_error=1;
508 break;
509 }
510 errno = 0;
511 PyFPE_START_PROTECT("strtod", return 0)
512 z = strtod(s, &end) ;
513 PyFPE_END_PROTECT(z)
514 if (errno != 0) {
515 sprintf(buffer,
516 "float() out of range: %.150s", s);
517 PyErr_SetString(
518 PyExc_ValueError,
519 buffer);
520 return NULL;
521 }
522 s=end;
523 if (*s=='J' || *s=='j') {
524
525 break;
526 }
527 if (got_re) {
528 sw_error=1;
529 break;
530 }
531
532 /* accept a real part */
533 x=sign*z;
534 got_re=1;
535 if (got_im) done=1;
536 z = -1.0;
537 sign = 1;
538 break;
539
540 } /* end of switch */
541
542 } while (*s!='\0' && !sw_error);
543
544 if (sw_error) {
545 PyErr_SetString(PyExc_ValueError,
546 "malformed string for complex()");
547 return NULL;
548 }
549
550 return PyComplex_FromDoubles(x,y);
551}
552
553static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000554builtin_complex(PyObject *self, PyObject *args)
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000555{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000556 PyObject *r, *i, *tmp;
557 PyNumberMethods *nbr, *nbi = NULL;
Guido van Rossum530956d1996-07-21 02:27:43 +0000558 Py_complex cr, ci;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000559 int own_r = 0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000560
561 i = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000562 if (!PyArg_ParseTuple(args, "O|O:complex", &r, &i))
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000563 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000564 if (PyString_Check(r) || PyUnicode_Check(r))
Guido van Rossum11950231999-03-25 21:16:07 +0000565 return complex_from_string(r);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000566 if ((nbr = r->ob_type->tp_as_number) == NULL ||
Guido van Rossumc6472e91997-03-31 17:15:43 +0000567 nbr->nb_float == NULL ||
568 (i != NULL &&
569 ((nbi = i->ob_type->tp_as_number) == NULL ||
570 nbi->nb_float == NULL))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000571 PyErr_SetString(PyExc_TypeError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000572 "complex() argument can't be converted to complex");
573 return NULL;
574 }
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000575 /* XXX Hack to support classes with __complex__ method */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000576 if (PyInstance_Check(r)) {
577 static PyObject *complexstr;
578 PyObject *f;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000579 if (complexstr == NULL) {
Guido van Rossum8d751611997-01-18 08:04:16 +0000580 complexstr = PyString_InternFromString("__complex__");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000581 if (complexstr == NULL)
582 return NULL;
583 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000584 f = PyObject_GetAttr(r, complexstr);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000585 if (f == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000586 PyErr_Clear();
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000587 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000588 PyObject *args = Py_BuildValue("()");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000589 if (args == NULL)
590 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000591 r = PyEval_CallObject(f, args);
592 Py_DECREF(args);
Barry Warsawf988e681999-01-27 23:13:59 +0000593 Py_DECREF(f);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000594 if (r == NULL)
595 return NULL;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000596 own_r = 1;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000597 }
598 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000599 if (PyComplex_Check(r)) {
600 cr = ((PyComplexObject*)r)->cval;
Guido van Rossum730806d1998-04-10 22:27:42 +0000601 if (own_r) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000602 Py_DECREF(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000603 }
Guido van Rossumc6472e91997-03-31 17:15:43 +0000604 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000605 else {
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000606 tmp = (*nbr->nb_float)(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000607 if (own_r) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000608 Py_DECREF(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000609 }
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000610 if (tmp == NULL)
611 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000612 cr.real = PyFloat_AsDouble(tmp);
613 Py_DECREF(tmp);
Guido van Rossum11950231999-03-25 21:16:07 +0000614 cr.imag = 0.0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000615 }
616 if (i == NULL) {
Guido van Rossum11950231999-03-25 21:16:07 +0000617 ci.real = 0.0;
618 ci.imag = 0.0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000619 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000620 else if (PyComplex_Check(i))
621 ci = ((PyComplexObject*)i)->cval;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000622 else {
Guido van Rossumc6472e91997-03-31 17:15:43 +0000623 tmp = (*nbi->nb_float)(i);
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000624 if (tmp == NULL)
625 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000626 ci.real = PyFloat_AsDouble(tmp);
627 Py_DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000628 ci.imag = 0.;
629 }
630 cr.real -= ci.imag;
631 cr.imag += ci.real;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000632 return PyComplex_FromCComplex(cr);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000633}
634
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000635static char complex_doc[] =
636"complex(real[, imag]) -> complex number\n\
637\n\
638Create a complex number from a real part and an optional imaginary part.\n\
639This is equivalent to (real + imag*1j) where imag defaults to 0.";
640
641
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000642#endif
643
Guido van Rossum79f25d91997-04-29 20:08:16 +0000644static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000645builtin_dir(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000646{
Guido van Rossum666b17a1997-05-06 16:36:57 +0000647 static char *attrlist[] = {"__members__", "__methods__", NULL};
648 PyObject *v = NULL, *l = NULL, *m = NULL;
649 PyObject *d, *x;
650 int i;
651 char **s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000652
Guido van Rossum79f25d91997-04-29 20:08:16 +0000653 if (!PyArg_ParseTuple(args, "|O:dir", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000654 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000655 if (v == NULL) {
Guido van Rossum666b17a1997-05-06 16:36:57 +0000656 x = PyEval_GetLocals();
657 if (x == NULL)
658 goto error;
659 l = PyMapping_Keys(x);
660 if (l == NULL)
661 goto error;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000662 }
663 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000664 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum666b17a1997-05-06 16:36:57 +0000665 if (d == NULL)
Guido van Rossum795ba581996-05-23 22:49:07 +0000666 PyErr_Clear();
Guido van Rossum666b17a1997-05-06 16:36:57 +0000667 else {
668 l = PyMapping_Keys(d);
669 if (l == NULL)
670 PyErr_Clear();
671 Py_DECREF(d);
672 }
673 if (l == NULL) {
674 l = PyList_New(0);
675 if (l == NULL)
676 goto error;
677 }
678 for (s = attrlist; *s != NULL; s++) {
679 m = PyObject_GetAttrString(v, *s);
680 if (m == NULL) {
681 PyErr_Clear();
682 continue;
683 }
684 for (i = 0; ; i++) {
685 x = PySequence_GetItem(m, i);
686 if (x == NULL) {
687 PyErr_Clear();
688 break;
689 }
690 if (PyList_Append(l, x) != 0) {
691 Py_DECREF(x);
692 Py_DECREF(m);
693 goto error;
694 }
695 Py_DECREF(x);
696 }
697 Py_DECREF(m);
Guido van Rossum795ba581996-05-23 22:49:07 +0000698 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000699 }
Guido van Rossum666b17a1997-05-06 16:36:57 +0000700 if (PyList_Sort(l) != 0)
701 goto error;
702 return l;
703 error:
704 Py_XDECREF(l);
705 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000706}
707
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000708static char dir_doc[] =
709"dir([object]) -> list of strings\n\
710\n\
711Return an alphabetized list of names comprising (some of) the attributes\n\
712of the given object. Without an argument, the names in the current scope\n\
713are listed. With an instance argument, only the instance attributes are\n\
714returned. With a class argument, attributes of the base class are not\n\
715returned. For other types or arguments, this may list members or methods.";
716
717
Guido van Rossum79f25d91997-04-29 20:08:16 +0000718static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000719builtin_divmod(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000720{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000721 PyObject *v, *w;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000722
Guido van Rossum79f25d91997-04-29 20:08:16 +0000723 if (!PyArg_ParseTuple(args, "OO:divmod", &v, &w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000724 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000725 return PyNumber_Divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000726}
727
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000728static char divmod_doc[] =
729"divmod(x, y) -> (div, mod)\n\
730\n\
731Return the tuple ((x-x%y)/y, x%y). Invariant: div*y + mod == x.";
732
733
Guido van Rossum79f25d91997-04-29 20:08:16 +0000734static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000735builtin_eval(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000736{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000737 PyObject *cmd;
738 PyObject *globals = Py_None, *locals = Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000739 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000740
Guido van Rossum79f25d91997-04-29 20:08:16 +0000741 if (!PyArg_ParseTuple(args, "O|O!O!:eval",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000742 &cmd,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000743 &PyDict_Type, &globals,
744 &PyDict_Type, &locals))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000745 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000746 if (globals == Py_None) {
747 globals = PyEval_GetGlobals();
748 if (locals == Py_None)
749 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000750 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000751 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000752 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000753 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
754 if (PyDict_SetItemString(globals, "__builtins__",
755 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000756 return NULL;
757 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000758 if (PyCode_Check(cmd))
759 return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals);
760 if (!PyString_Check(cmd)) {
761 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000762 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000763 return NULL;
764 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000765 str = PyString_AsString(cmd);
Guido van Rossum106f2da2000-06-28 21:12:25 +0000766 if (strlen(str) != (size_t)PyString_Size(cmd)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000767 PyErr_SetString(PyExc_ValueError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000768 "embedded '\\0' in string arg");
769 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000770 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000771 while (*str == ' ' || *str == '\t')
772 str++;
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000773 return PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000774}
775
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000776static char eval_doc[] =
777"eval(source[, globals[, locals]]) -> value\n\
778\n\
779Evaluate the source in the context of globals and locals.\n\
780The source may be a string representing a Python expression\n\
781or a code object as returned by compile().\n\
782The globals and locals are dictionaries, defaulting to the current\n\
783globals and locals. If only globals is given, locals defaults to it.";
784
785
Guido van Rossum79f25d91997-04-29 20:08:16 +0000786static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000787builtin_execfile(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000788{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000789 char *filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000790 PyObject *globals = Py_None, *locals = Py_None;
791 PyObject *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000792 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000793
Guido van Rossum79f25d91997-04-29 20:08:16 +0000794 if (!PyArg_ParseTuple(args, "s|O!O!:execfile",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000795 &filename,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000796 &PyDict_Type, &globals,
797 &PyDict_Type, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000798 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000799 if (globals == Py_None) {
800 globals = PyEval_GetGlobals();
801 if (locals == Py_None)
802 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000803 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000804 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000805 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000806 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
807 if (PyDict_SetItemString(globals, "__builtins__",
808 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000809 return NULL;
810 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000811 Py_BEGIN_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000812 fp = fopen(filename, "r");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000813 Py_END_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000814 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000815 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000816 return NULL;
817 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000818 res = PyRun_File(fp, filename, Py_file_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000819 Py_BEGIN_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000820 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000821 Py_END_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000822 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000823}
824
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000825static char execfile_doc[] =
826"execfile(filename[, globals[, locals]])\n\
827\n\
828Read and execute a Python script from a file.\n\
829The globals and locals are dictionaries, defaulting to the current\n\
830globals and locals. If only globals is given, locals defaults to it.";
831
832
Guido van Rossum79f25d91997-04-29 20:08:16 +0000833static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000834builtin_getattr(PyObject *self, PyObject *args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000835{
Guido van Rossum950ff291998-06-29 13:38:57 +0000836 PyObject *v, *result, *dflt = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000837 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000838
Guido van Rossum950ff291998-06-29 13:38:57 +0000839 if (!PyArg_ParseTuple(args, "OS|O:getattr", &v, &name, &dflt))
Guido van Rossum33894be1992-01-27 16:53:09 +0000840 return NULL;
Guido van Rossum950ff291998-06-29 13:38:57 +0000841 result = PyObject_GetAttr(v, name);
842 if (result == NULL && dflt != NULL) {
843 PyErr_Clear();
844 Py_INCREF(dflt);
845 result = dflt;
846 }
847 return result;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000848}
849
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000850static char getattr_doc[] =
Guido van Rossum950ff291998-06-29 13:38:57 +0000851"getattr(object, name[, default]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000852\n\
Guido van Rossum950ff291998-06-29 13:38:57 +0000853Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\n\
854When a default argument is given, it is returned when the attribute doesn't\n\
855exist; without it, an exception is raised in that case.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000856
857
Guido van Rossum79f25d91997-04-29 20:08:16 +0000858static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000859builtin_globals(PyObject *self, PyObject *args)
Guido van Rossum872537c1995-07-07 22:43:42 +0000860{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000861 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +0000862
Guido van Rossum43713e52000-02-29 13:59:29 +0000863 if (!PyArg_ParseTuple(args, ":globals"))
Guido van Rossum872537c1995-07-07 22:43:42 +0000864 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000865 d = PyEval_GetGlobals();
866 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +0000867 return d;
868}
869
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000870static char globals_doc[] =
871"globals() -> dictionary\n\
872\n\
873Return the dictionary containing the current scope's global variables.";
874
875
Guido van Rossum79f25d91997-04-29 20:08:16 +0000876static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000877builtin_hasattr(PyObject *self, PyObject *args)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000878{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000879 PyObject *v;
880 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000881
Guido van Rossum79f25d91997-04-29 20:08:16 +0000882 if (!PyArg_ParseTuple(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000883 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000884 v = PyObject_GetAttr(v, name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000885 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000886 PyErr_Clear();
Guido van Rossum09df08a1998-05-22 00:51:39 +0000887 Py_INCREF(Py_False);
888 return Py_False;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000889 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000890 Py_DECREF(v);
Guido van Rossum09df08a1998-05-22 00:51:39 +0000891 Py_INCREF(Py_True);
892 return Py_True;
Guido van Rossum33894be1992-01-27 16:53:09 +0000893}
894
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000895static char hasattr_doc[] =
896"hasattr(object, name) -> Boolean\n\
897\n\
898Return whether the object has an attribute with the given name.\n\
899(This is done by calling getattr(object, name) and catching exceptions.)";
900
901
Guido van Rossum79f25d91997-04-29 20:08:16 +0000902static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000903builtin_id(PyObject *self, PyObject *args)
Guido van Rossum5b722181993-03-30 17:46:03 +0000904{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000905 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000906
Guido van Rossum79f25d91997-04-29 20:08:16 +0000907 if (!PyArg_ParseTuple(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000908 return NULL;
Guido van Rossum106f2da2000-06-28 21:12:25 +0000909 return PyLong_FromVoidPtr(v);
Guido van Rossum5b722181993-03-30 17:46:03 +0000910}
911
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000912static char id_doc[] =
913"id(object) -> integer\n\
914\n\
915Return the identity of an object. This is guaranteed to be unique among\n\
916simultaneously existing objects. (Hint: it's the object's memory address.)";
917
918
Guido van Rossum79f25d91997-04-29 20:08:16 +0000919static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000920builtin_map(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000921{
922 typedef struct {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000923 PyObject *seq;
924 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000925 int len;
926 } sequence;
927
Guido van Rossum79f25d91997-04-29 20:08:16 +0000928 PyObject *func, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000929 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000930 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000931 register int i, j;
932
Guido van Rossum79f25d91997-04-29 20:08:16 +0000933 n = PyTuple_Size(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000934 if (n < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000935 PyErr_SetString(PyExc_TypeError,
936 "map() requires at least two args");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000937 return NULL;
938 }
939
Guido van Rossum79f25d91997-04-29 20:08:16 +0000940 func = PyTuple_GetItem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000941 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000942
Guido van Rossumfa4ac711998-07-10 17:37:30 +0000943 if (func == Py_None && n == 1) {
944 /* map(None, S) is the same as list(S). */
945 return PySequence_List(PyTuple_GetItem(args, 1));
946 }
947
Guido van Rossum79f25d91997-04-29 20:08:16 +0000948 if ((seqs = PyMem_NEW(sequence, n)) == NULL) {
949 PyErr_NoMemory();
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000950 goto Fail_2;
951 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000952
Guido van Rossum2d951851994-08-29 12:52:16 +0000953 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000954 int curlen;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000955 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000956
Guido van Rossum79f25d91997-04-29 20:08:16 +0000957 if ((sqp->seq = PyTuple_GetItem(args, i + 1)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000958 goto Fail_2;
959
Guido van Rossum09df08a1998-05-22 00:51:39 +0000960 sqp->sqf = sqf = sqp->seq->ob_type->tp_as_sequence;
961 if (sqf == NULL ||
962 sqf->sq_length == NULL ||
963 sqf->sq_item == NULL)
964 {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000965 static char errmsg[] =
966 "argument %d to map() must be a sequence object";
Guido van Rossum15e33a41997-04-30 19:00:27 +0000967 char errbuf[sizeof(errmsg) + 25];
Guido van Rossum12d12c51993-10-26 17:58:25 +0000968
969 sprintf(errbuf, errmsg, i+2);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000970 PyErr_SetString(PyExc_TypeError, errbuf);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000971 goto Fail_2;
972 }
973
974 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
975 goto Fail_2;
976
977 if (curlen > len)
978 len = curlen;
979 }
980
Guido van Rossum79f25d91997-04-29 20:08:16 +0000981 if ((result = (PyObject *) PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000982 goto Fail_2;
983
Guido van Rossum2d951851994-08-29 12:52:16 +0000984 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000985 PyObject *alist, *item=NULL, *value;
Guido van Rossum2d951851994-08-29 12:52:16 +0000986 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000987
Guido van Rossum79f25d91997-04-29 20:08:16 +0000988 if (func == Py_None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +0000989 alist = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000990 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000991 if ((alist = PyTuple_New(n)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +0000992 goto Fail_1;
993 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000994
995 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000996 if (sqp->len < 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000997 Py_INCREF(Py_None);
998 item = Py_None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000999 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001000 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001001 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +00001002 if (item == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001003 if (PyErr_ExceptionMatches(
1004 PyExc_IndexError))
1005 {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001006 PyErr_Clear();
1007 Py_INCREF(Py_None);
1008 item = Py_None;
Guido van Rossum2d951851994-08-29 12:52:16 +00001009 sqp->len = -1;
1010 }
1011 else {
1012 goto Fail_0;
1013 }
1014 }
1015 else
1016 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001017
Guido van Rossum12d12c51993-10-26 17:58:25 +00001018 }
Guido van Rossum32120311995-07-10 13:52:21 +00001019 if (!alist)
Guido van Rossum2d951851994-08-29 12:52:16 +00001020 break;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001021 if (PyTuple_SetItem(alist, j, item) < 0) {
1022 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001023 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +00001024 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001025 continue;
1026
1027 Fail_0:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001028 Py_XDECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001029 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001030 }
1031
Guido van Rossum32120311995-07-10 13:52:21 +00001032 if (!alist)
1033 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +00001034
1035 if (!any) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001036 Py_DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +00001037 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001038 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001039
Guido van Rossum79f25d91997-04-29 20:08:16 +00001040 if (func == Py_None)
Guido van Rossum32120311995-07-10 13:52:21 +00001041 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001042 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001043 value = PyEval_CallObject(func, alist);
1044 Py_DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001045 if (value == NULL)
1046 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +00001047 }
1048 if (i >= len) {
Barry Warsawfa77e091999-01-28 18:49:12 +00001049 int status = PyList_Append(result, value);
Barry Warsaw21332871999-01-28 04:21:35 +00001050 Py_DECREF(value);
Barry Warsawfa77e091999-01-28 18:49:12 +00001051 if (status < 0)
1052 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +00001053 }
1054 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001055 if (PyList_SetItem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001056 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001057 }
1058 }
1059
Guido van Rossumfa4ac711998-07-10 17:37:30 +00001060 if (i < len && PyList_SetSlice(result, i, len, NULL) < 0)
1061 goto Fail_1;
1062
Guido van Rossum79f25d91997-04-29 20:08:16 +00001063 PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001064 return result;
1065
Guido van Rossum12d12c51993-10-26 17:58:25 +00001066Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001067 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001068Fail_2:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001069 if (seqs) PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001070 return NULL;
1071}
1072
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001073static char map_doc[] =
1074"map(function, sequence[, sequence, ...]) -> list\n\
1075\n\
1076Return a list of the results of applying the function to the items of\n\
1077the argument sequence(s). If more than one sequence is given, the\n\
1078function is called with an argument list consisting of the corresponding\n\
1079item of each sequence, substituting None for missing values when not all\n\
1080sequences have the same length. If the function is None, return a list of\n\
1081the items of the sequence (or a list of tuples if more than one sequence).";
1082
1083
Guido van Rossum79f25d91997-04-29 20:08:16 +00001084static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001085builtin_setattr(PyObject *self, PyObject *args)
Guido van Rossum33894be1992-01-27 16:53:09 +00001086{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001087 PyObject *v;
1088 PyObject *name;
1089 PyObject *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001090
Guido van Rossum79f25d91997-04-29 20:08:16 +00001091 if (!PyArg_ParseTuple(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +00001092 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001093 if (PyObject_SetAttr(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +00001094 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001095 Py_INCREF(Py_None);
1096 return Py_None;
Guido van Rossum33894be1992-01-27 16:53:09 +00001097}
1098
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001099static char setattr_doc[] =
1100"setattr(object, name, value)\n\
1101\n\
1102Set a named attribute on an object; setattr(x, 'y', v) is equivalent to\n\
1103``x.y = v''.";
1104
1105
Guido van Rossum79f25d91997-04-29 20:08:16 +00001106static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001107builtin_delattr(PyObject *self, PyObject *args)
Guido van Rossum14144fc1994-08-29 12:53:40 +00001108{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001109 PyObject *v;
1110 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001111
Guido van Rossum79f25d91997-04-29 20:08:16 +00001112 if (!PyArg_ParseTuple(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +00001113 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001114 if (PyObject_SetAttr(v, name, (PyObject *)NULL) != 0)
Guido van Rossum14144fc1994-08-29 12:53:40 +00001115 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001116 Py_INCREF(Py_None);
1117 return Py_None;
Guido van Rossum14144fc1994-08-29 12:53:40 +00001118}
1119
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001120static char delattr_doc[] =
Guido van Rossumdf12a591998-11-23 22:13:04 +00001121"delattr(object, name)\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001122\n\
1123Delete a named attribute on an object; delattr(x, 'y') is equivalent to\n\
1124``del x.y''.";
1125
1126
Guido van Rossum79f25d91997-04-29 20:08:16 +00001127static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001128builtin_hash(PyObject *self, PyObject *args)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001129{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001130 PyObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001131 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001132
Guido van Rossum79f25d91997-04-29 20:08:16 +00001133 if (!PyArg_ParseTuple(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +00001134 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001135 x = PyObject_Hash(v);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001136 if (x == -1)
1137 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001138 return PyInt_FromLong(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001139}
1140
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001141static char hash_doc[] =
1142"hash(object) -> integer\n\
1143\n\
1144Return a hash value for the object. Two objects with the same value have\n\
1145the same hash value. The reverse is not necessarily true, but likely.";
1146
1147
Guido van Rossum79f25d91997-04-29 20:08:16 +00001148static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001149builtin_hex(PyObject *self, PyObject *args)
Guido van Rossum006bcd41991-10-24 14:54:44 +00001150{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001151 PyObject *v;
1152 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001153
Guido van Rossum79f25d91997-04-29 20:08:16 +00001154 if (!PyArg_ParseTuple(args, "O:hex", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001155 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001156
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001157 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001158 nb->nb_hex == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001159 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001160 "hex() argument can't be converted to hex");
1161 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001162 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001163 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001164}
1165
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001166static char hex_doc[] =
1167"hex(number) -> string\n\
1168\n\
1169Return the hexadecimal representation of an integer or long integer.";
1170
1171
Tim Petersdbd9ba62000-07-09 03:09:57 +00001172static PyObject *builtin_raw_input(PyObject *, PyObject *);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001173
Guido van Rossum79f25d91997-04-29 20:08:16 +00001174static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001175builtin_input(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001176{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001177 PyObject *line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001178 char *str;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001179 PyObject *res;
1180 PyObject *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001181
1182 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001183 if (line == NULL)
1184 return line;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001185 if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001186 return NULL;
1187 while (*str == ' ' || *str == '\t')
1188 str++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001189 globals = PyEval_GetGlobals();
1190 locals = PyEval_GetLocals();
1191 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
1192 if (PyDict_SetItemString(globals, "__builtins__",
1193 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +00001194 return NULL;
1195 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00001196 res = PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001197 Py_DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001198 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001199}
1200
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001201static char input_doc[] =
1202"input([prompt]) -> value\n\
1203\n\
1204Equivalent to eval(raw_input(prompt)).";
1205
1206
Guido van Rossume8811f81997-02-14 15:48:05 +00001207static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001208builtin_intern(PyObject *self, PyObject *args)
Guido van Rossume8811f81997-02-14 15:48:05 +00001209{
1210 PyObject *s;
Guido van Rossum43713e52000-02-29 13:59:29 +00001211 if (!PyArg_ParseTuple(args, "S:intern", &s))
Guido van Rossume8811f81997-02-14 15:48:05 +00001212 return NULL;
1213 Py_INCREF(s);
1214 PyString_InternInPlace(&s);
1215 return s;
1216}
1217
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001218static char intern_doc[] =
1219"intern(string) -> string\n\
1220\n\
1221``Intern'' the given string. This enters the string in the (global)\n\
1222table of interned strings whose purpose is to speed up dictionary lookups.\n\
1223Return the string itself or the previously interned string object with the\n\
1224same value.";
1225
1226
Guido van Rossum79f25d91997-04-29 20:08:16 +00001227static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001228builtin_int(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001229{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001230 PyObject *v;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001231 int base = -909; /* unlikely! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001232
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001233 if (!PyArg_ParseTuple(args, "O|i:int", &v, &base))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001234 return NULL;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001235 if (base == -909)
1236 return PyNumber_Int(v);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001237 else if (PyString_Check(v))
1238 return PyInt_FromString(PyString_AS_STRING(v), NULL, base);
1239 else if (PyUnicode_Check(v))
1240 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(v),
1241 PyUnicode_GET_SIZE(v),
1242 base);
1243 else {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001244 PyErr_SetString(PyExc_TypeError,
1245 "can't convert non-string with explicit base");
1246 return NULL;
1247 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001248}
1249
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001250static char int_doc[] =
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001251"int(x[, base]) -> integer\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001252\n\
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001253Convert a string or number to an integer, if possible. A floating point\n\
1254argument will be truncated towards zero (this does not include a string\n\
1255representation of a floating point number!) When converting a string, use\n\
1256the optional base. It is an error to supply a base when converting a\n\
1257non-string.";
1258
1259
1260static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001261builtin_long(PyObject *self, PyObject *args)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001262{
1263 PyObject *v;
1264 int base = -909; /* unlikely! */
1265
1266 if (!PyArg_ParseTuple(args, "O|i:long", &v, &base))
1267 return NULL;
1268 if (base == -909)
1269 return PyNumber_Long(v);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001270 else if (PyString_Check(v))
1271 return PyLong_FromString(PyString_AS_STRING(v), NULL, base);
1272 else if (PyUnicode_Check(v))
1273 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(v),
1274 PyUnicode_GET_SIZE(v),
1275 base);
1276 else {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001277 PyErr_SetString(PyExc_TypeError,
1278 "can't convert non-string with explicit base");
1279 return NULL;
1280 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001281}
1282
1283static char long_doc[] =
1284"long(x) -> long integer\n\
1285long(x, base) -> long integer\n\
1286\n\
1287Convert a string or number to a long integer, if possible. A floating\n\
1288point argument will be truncated towards zero (this does not include a\n\
1289string representation of a floating point number!) When converting a\n\
1290string, use the given base. It is an error to supply a base when\n\
1291converting a non-string.";
1292
1293
1294static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001295builtin_float(PyObject *self, PyObject *args)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001296{
1297 PyObject *v;
1298
1299 if (!PyArg_ParseTuple(args, "O:float", &v))
1300 return NULL;
1301 if (PyString_Check(v))
1302 return PyFloat_FromString(v, NULL);
1303 return PyNumber_Float(v);
1304}
1305
1306static char float_doc[] =
1307"float(x) -> floating point number\n\
1308\n\
1309Convert a string or number to a floating point number, if possible.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001310
1311
Guido van Rossum79f25d91997-04-29 20:08:16 +00001312static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001313builtin_len(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001314{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001315 PyObject *v;
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001316 long res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001317
Guido van Rossum79f25d91997-04-29 20:08:16 +00001318 if (!PyArg_ParseTuple(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001319 return NULL;
Jeremy Hylton03657cf2000-07-12 13:05:33 +00001320 res = PyObject_Size(v);
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001321 if (res < 0 && PyErr_Occurred())
1322 return NULL;
1323 return PyInt_FromLong(res);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001324}
1325
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001326static char len_doc[] =
1327"len(object) -> integer\n\
1328\n\
1329Return the number of items of a sequence or mapping.";
1330
1331
Guido van Rossum79f25d91997-04-29 20:08:16 +00001332static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001333builtin_list(PyObject *self, PyObject *args)
Guido van Rossumd1705771996-04-09 02:41:06 +00001334{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001335 PyObject *v;
Guido van Rossumd1705771996-04-09 02:41:06 +00001336
Guido van Rossum79f25d91997-04-29 20:08:16 +00001337 if (!PyArg_ParseTuple(args, "O:list", &v))
Guido van Rossumd1705771996-04-09 02:41:06 +00001338 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001339 return PySequence_List(v);
Guido van Rossumd1705771996-04-09 02:41:06 +00001340}
1341
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001342static char list_doc[] =
1343"list(sequence) -> list\n\
1344\n\
1345Return a new list whose items are the same as those of the argument sequence.";
1346
Guido van Rossum8861b741996-07-30 16:49:37 +00001347
1348static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001349builtin_slice(PyObject *self, PyObject *args)
Guido van Rossum8861b741996-07-30 16:49:37 +00001350{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001351 PyObject *start, *stop, *step;
Guido van Rossum8861b741996-07-30 16:49:37 +00001352
Guido van Rossum09df08a1998-05-22 00:51:39 +00001353 start = stop = step = NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001354
Guido van Rossum09df08a1998-05-22 00:51:39 +00001355 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
1356 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001357
Guido van Rossum09df08a1998-05-22 00:51:39 +00001358 /* This swapping of stop and start is to maintain similarity with
1359 range(). */
1360 if (stop == NULL) {
1361 stop = start;
1362 start = NULL;
1363 }
1364 return PySlice_New(start, stop, step);
Guido van Rossum8861b741996-07-30 16:49:37 +00001365}
1366
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001367static char slice_doc[] =
Fred Drake3d587441999-07-19 15:21:16 +00001368"slice([start,] stop[, step]) -> slice object\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001369\n\
1370Create a slice object. This is used for slicing by the Numeric extensions.";
1371
1372
Guido van Rossum79f25d91997-04-29 20:08:16 +00001373static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001374builtin_locals(PyObject *self, PyObject *args)
Guido van Rossum872537c1995-07-07 22:43:42 +00001375{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001376 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +00001377
Guido van Rossum43713e52000-02-29 13:59:29 +00001378 if (!PyArg_ParseTuple(args, ":locals"))
Guido van Rossum872537c1995-07-07 22:43:42 +00001379 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001380 d = PyEval_GetLocals();
1381 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +00001382 return d;
1383}
1384
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001385static char locals_doc[] =
1386"locals() -> dictionary\n\
1387\n\
1388Return the dictionary containing the current scope's local variables.";
1389
1390
Guido van Rossum79f25d91997-04-29 20:08:16 +00001391static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001392min_max(PyObject *args, int sign)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001393{
Guido van Rossum2d951851994-08-29 12:52:16 +00001394 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001395 PyObject *v, *w, *x;
1396 PySequenceMethods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001397
Guido van Rossum79f25d91997-04-29 20:08:16 +00001398 if (PyTuple_Size(args) > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001399 v = args;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001400 else if (!PyArg_ParseTuple(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001401 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001402 sq = v->ob_type->tp_as_sequence;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001403 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001404 PyErr_SetString(PyExc_TypeError,
1405 "min() or max() of non-sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001406 return NULL;
1407 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001408 w = NULL;
1409 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001410 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +00001411 if (x == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001412 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001413 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001414 break;
1415 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001416 Py_XDECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001417 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001418 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001419 if (w == NULL)
1420 w = x;
1421 else {
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001422 int c = PyObject_Compare(x, w);
1423 if (c && PyErr_Occurred()) {
1424 Py_DECREF(x);
1425 Py_XDECREF(w);
1426 return NULL;
1427 }
1428 if (c * sign > 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001429 Py_DECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001430 w = x;
1431 }
1432 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001433 Py_DECREF(x);
Guido van Rossum2d951851994-08-29 12:52:16 +00001434 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001435 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001436 if (w == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001437 PyErr_SetString(PyExc_ValueError,
1438 "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001439 return w;
1440}
1441
Guido van Rossum79f25d91997-04-29 20:08:16 +00001442static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001443builtin_min(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001444{
1445 return min_max(v, -1);
1446}
1447
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001448static char min_doc[] =
1449"min(sequence) -> value\n\
1450min(a, b, c, ...) -> value\n\
1451\n\
1452With a single sequence argument, return its smallest item.\n\
1453With two or more arguments, return the smallest argument.";
1454
1455
Guido van Rossum79f25d91997-04-29 20:08:16 +00001456static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001457builtin_max(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001458{
1459 return min_max(v, 1);
1460}
1461
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001462static char max_doc[] =
1463"max(sequence) -> value\n\
1464max(a, b, c, ...) -> value\n\
1465\n\
1466With a single sequence argument, return its largest item.\n\
1467With two or more arguments, return the largest argument.";
1468
1469
Guido van Rossum79f25d91997-04-29 20:08:16 +00001470static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001471builtin_oct(PyObject *self, PyObject *args)
Guido van Rossum006bcd41991-10-24 14:54:44 +00001472{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001473 PyObject *v;
1474 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001475
Guido van Rossum79f25d91997-04-29 20:08:16 +00001476 if (!PyArg_ParseTuple(args, "O:oct", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001477 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001478 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1479 nb->nb_oct == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001480 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001481 "oct() argument can't be converted to oct");
1482 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001483 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001484 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001485}
1486
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001487static char oct_doc[] =
1488"oct(number) -> string\n\
1489\n\
1490Return the octal representation of an integer or long integer.";
1491
1492
Guido van Rossum79f25d91997-04-29 20:08:16 +00001493static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001494builtin_open(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001495{
Guido van Rossum2d951851994-08-29 12:52:16 +00001496 char *name;
1497 char *mode = "r";
1498 int bufsize = -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001499 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001500
Guido van Rossum79f25d91997-04-29 20:08:16 +00001501 if (!PyArg_ParseTuple(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001502 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001503 f = PyFile_FromString(name, mode);
Guido van Rossum2d951851994-08-29 12:52:16 +00001504 if (f != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001505 PyFile_SetBufSize(f, bufsize);
Guido van Rossum2d951851994-08-29 12:52:16 +00001506 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001507}
1508
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001509static char open_doc[] =
1510"open(filename[, mode[, buffering]]) -> file object\n\
1511\n\
1512Open a file. The mode can be 'r', 'w' or 'a' for reading (default),\n\
1513writing or appending. The file will be created if it doesn't exist\n\
1514when opened for writing or appending; it will be truncated when\n\
1515opened for writing. Add a 'b' to the mode for binary files.\n\
1516Add a '+' to the mode to allow simultaneous reading and writing.\n\
1517If the buffering argument is given, 0 means unbuffered, 1 means line\n\
1518buffered, and larger numbers specify the buffer size.";
1519
1520
Guido van Rossum79f25d91997-04-29 20:08:16 +00001521static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001522builtin_ord(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001523{
Guido van Rossum09095f32000-03-10 23:00:52 +00001524 PyObject *obj;
1525 long ord;
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001526 int size;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001527
Guido van Rossum09095f32000-03-10 23:00:52 +00001528 if (!PyArg_ParseTuple(args, "O:ord", &obj))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001529 return NULL;
Guido van Rossum09095f32000-03-10 23:00:52 +00001530
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001531 if (PyString_Check(obj)) {
1532 size = PyString_GET_SIZE(obj);
1533 if (size == 1)
1534 ord = (long)((unsigned char)*PyString_AS_STRING(obj));
1535 } else if (PyUnicode_Check(obj)) {
1536 size = PyUnicode_GET_SIZE(obj);
1537 if (size == 1)
1538 ord = (long)*PyUnicode_AS_UNICODE(obj);
1539 } else {
1540 PyErr_Format(PyExc_TypeError,
Fred Drake078b24f2000-04-13 02:42:50 +00001541 "expected string or Unicode character, " \
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001542 "%.200s found", obj->ob_type->tp_name);
Guido van Rossum09095f32000-03-10 23:00:52 +00001543 return NULL;
1544 }
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001545 if (size == 1)
1546 return PyInt_FromLong(ord);
Guido van Rossum09095f32000-03-10 23:00:52 +00001547
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001548 PyErr_Format(PyExc_TypeError,
1549 "expected a character, length-%d string found",
1550 size);
1551 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001552}
1553
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001554static char ord_doc[] =
1555"ord(c) -> integer\n\
1556\n\
Fred Drake078b24f2000-04-13 02:42:50 +00001557Return the integer ordinal of a one character string.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001558
1559
Guido van Rossum79f25d91997-04-29 20:08:16 +00001560static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001561builtin_pow(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001562{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001563 PyObject *v, *w, *z = Py_None;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001564
Guido van Rossum79f25d91997-04-29 20:08:16 +00001565 if (!PyArg_ParseTuple(args, "OO|O:pow", &v, &w, &z))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001566 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001567 return PyNumber_Power(v, w, z);
Guido van Rossumd4905451991-05-05 20:00:36 +00001568}
1569
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001570static char pow_doc[] =
1571"pow(x, y[, z]) -> number\n\
1572\n\
1573With two arguments, equivalent to x**y. With three arguments,\n\
1574equivalent to (x**y) % z, but may be more efficient (e.g. for longs).";
1575
1576
Guido van Rossum124eff01999-02-23 16:11:01 +00001577/* Return number of items in range/xrange (lo, hi, step). step > 0
1578 * required. Return a value < 0 if & only if the true value is too
1579 * large to fit in a signed long.
1580 */
1581static long
Thomas Wouterse28c2962000-07-23 22:21:32 +00001582get_len_of_range(long lo, long hi, long step)
Guido van Rossum124eff01999-02-23 16:11:01 +00001583{
1584 /* -------------------------------------------------------------
1585 If lo >= hi, the range is empty.
1586 Else if n values are in the range, the last one is
1587 lo + (n-1)*step, which must be <= hi-1. Rearranging,
1588 n <= (hi - lo - 1)/step + 1, so taking the floor of the RHS gives
1589 the proper value. Since lo < hi in this case, hi-lo-1 >= 0, so
1590 the RHS is non-negative and so truncation is the same as the
1591 floor. Letting M be the largest positive long, the worst case
1592 for the RHS numerator is hi=M, lo=-M-1, and then
1593 hi-lo-1 = M-(-M-1)-1 = 2*M. Therefore unsigned long has enough
1594 precision to compute the RHS exactly.
1595 ---------------------------------------------------------------*/
1596 long n = 0;
1597 if (lo < hi) {
1598 unsigned long uhi = (unsigned long)hi;
1599 unsigned long ulo = (unsigned long)lo;
1600 unsigned long diff = uhi - ulo - 1;
1601 n = (long)(diff / (unsigned long)step + 1);
1602 }
1603 return n;
1604}
1605
Guido van Rossum79f25d91997-04-29 20:08:16 +00001606static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001607builtin_range(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001608{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001609 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum124eff01999-02-23 16:11:01 +00001610 long bign;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001611 int i, n;
Guido van Rossum124eff01999-02-23 16:11:01 +00001612
Guido van Rossum79f25d91997-04-29 20:08:16 +00001613 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001614
Guido van Rossum79f25d91997-04-29 20:08:16 +00001615 if (PyTuple_Size(args) <= 1) {
1616 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001617 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001618 &ihigh))
1619 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001620 }
1621 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001622 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001623 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001624 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001625 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001626 }
1627 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001628 PyErr_SetString(PyExc_ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001629 return NULL;
1630 }
Guido van Rossum124eff01999-02-23 16:11:01 +00001631 if (istep > 0)
1632 bign = get_len_of_range(ilow, ihigh, istep);
1633 else
1634 bign = get_len_of_range(ihigh, ilow, -istep);
1635 n = (int)bign;
1636 if (bign < 0 || (long)n != bign) {
Guido van Rossume23cde21999-01-12 05:07:47 +00001637 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum124eff01999-02-23 16:11:01 +00001638 "range() has too many items");
Guido van Rossume23cde21999-01-12 05:07:47 +00001639 return NULL;
1640 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001641 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001642 if (v == NULL)
1643 return NULL;
1644 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001645 PyObject *w = PyInt_FromLong(ilow);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001646 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001647 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001648 return NULL;
1649 }
Guido van Rossuma937d141998-04-24 18:22:02 +00001650 PyList_SET_ITEM(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001651 ilow += istep;
1652 }
1653 return v;
1654}
1655
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001656static char range_doc[] =
1657"range([start,] stop[, step]) -> list of integers\n\
1658\n\
1659Return a list containing an arithmetic progression of integers.\n\
1660range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.\n\
1661When step is given, it specifies the increment (or decrement).\n\
1662For example, range(4) returns [0, 1, 2, 3]. The end point is omitted!\n\
1663These are exactly the valid indices for a list of 4 elements.";
1664
1665
Guido van Rossum79f25d91997-04-29 20:08:16 +00001666static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001667builtin_xrange(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001668{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001669 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001670 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001671
Guido van Rossum79f25d91997-04-29 20:08:16 +00001672 if (PyTuple_Size(args) <= 1) {
1673 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001674 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001675 &ihigh))
1676 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001677 }
1678 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001679 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001680 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001681 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001682 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001683 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001684 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001685 PyErr_SetString(PyExc_ValueError, "zero step for xrange()");
Guido van Rossum12d12c51993-10-26 17:58:25 +00001686 return NULL;
1687 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001688 if (istep > 0)
Guido van Rossum124eff01999-02-23 16:11:01 +00001689 n = get_len_of_range(ilow, ihigh, istep);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001690 else
Guido van Rossum124eff01999-02-23 16:11:01 +00001691 n = get_len_of_range(ihigh, ilow, -istep);
1692 if (n < 0) {
1693 PyErr_SetString(PyExc_OverflowError,
1694 "xrange() has more than sys.maxint items");
1695 return NULL;
1696 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001697 return PyRange_New(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001698}
1699
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001700static char xrange_doc[] =
1701"xrange([start,] stop[, step]) -> xrange object\n\
1702\n\
1703Like range(), but instead of returning a list, returns an object that\n\
1704generates the numbers in the range on demand. This is slightly slower\n\
1705than range() but more memory efficient.";
1706
1707
Guido van Rossum79f25d91997-04-29 20:08:16 +00001708static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001709builtin_raw_input(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001710{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001711 PyObject *v = NULL;
1712 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001713
Guido van Rossum79f25d91997-04-29 20:08:16 +00001714 if (!PyArg_ParseTuple(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001715 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001716 if (PyFile_AsFile(PySys_GetObject("stdin")) == stdin &&
1717 PyFile_AsFile(PySys_GetObject("stdout")) == stdout &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001718 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001719 PyObject *po;
Guido van Rossum872537c1995-07-07 22:43:42 +00001720 char *prompt;
1721 char *s;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001722 PyObject *result;
Guido van Rossum872537c1995-07-07 22:43:42 +00001723 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001724 po = PyObject_Str(v);
Guido van Rossum872537c1995-07-07 22:43:42 +00001725 if (po == NULL)
1726 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001727 prompt = PyString_AsString(po);
Guido van Rossumd9b52081998-06-26 18:25:38 +00001728 if (prompt == NULL)
1729 return NULL;
Guido van Rossum872537c1995-07-07 22:43:42 +00001730 }
1731 else {
1732 po = NULL;
1733 prompt = "";
1734 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001735 s = PyOS_Readline(prompt);
1736 Py_XDECREF(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001737 if (s == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001738 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossum872537c1995-07-07 22:43:42 +00001739 return NULL;
1740 }
1741 if (*s == '\0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001742 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum872537c1995-07-07 22:43:42 +00001743 result = NULL;
1744 }
1745 else { /* strip trailing '\n' */
Guido van Rossum106f2da2000-06-28 21:12:25 +00001746 size_t len = strlen(s);
1747 if (len > INT_MAX) {
1748 PyErr_SetString(PyExc_OverflowError, "input too long");
1749 result = NULL;
1750 }
1751 else {
1752 result = PyString_FromStringAndSize(s, (int)(len-1));
1753 }
Guido van Rossum872537c1995-07-07 22:43:42 +00001754 }
Guido van Rossumb18618d2000-05-03 23:44:39 +00001755 PyMem_FREE(s);
Guido van Rossum872537c1995-07-07 22:43:42 +00001756 return result;
1757 }
Guido van Rossum90933611991-06-07 16:10:43 +00001758 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001759 f = PySys_GetObject("stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001760 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001761 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001762 return NULL;
1763 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001764 if (Py_FlushLine() != 0 ||
1765 PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001766 return NULL;
1767 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001768 f = PySys_GetObject("stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001769 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001770 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001771 return NULL;
1772 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001773 return PyFile_GetLine(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001774}
1775
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001776static char raw_input_doc[] =
1777"raw_input([prompt]) -> string\n\
1778\n\
1779Read a string from standard input. The trailing newline is stripped.\n\
1780If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.\n\
1781On Unix, GNU readline is used if enabled. The prompt string, if given,\n\
1782is printed without a trailing newline before reading.";
1783
1784
Guido van Rossum79f25d91997-04-29 20:08:16 +00001785static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001786builtin_reduce(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001787{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001788 PyObject *seq, *func, *result = NULL;
1789 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001790 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001791
Guido van Rossum79f25d91997-04-29 20:08:16 +00001792 if (!PyArg_ParseTuple(args, "OO|O:reduce", &func, &seq, &result))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001793 return NULL;
1794 if (result != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001795 Py_INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001796
Guido van Rossum09df08a1998-05-22 00:51:39 +00001797 sqf = seq->ob_type->tp_as_sequence;
1798 if (sqf == NULL || sqf->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001799 PyErr_SetString(PyExc_TypeError,
Guido van Rossum12d12c51993-10-26 17:58:25 +00001800 "2nd argument to reduce() must be a sequence object");
1801 return NULL;
1802 }
1803
Guido van Rossum79f25d91997-04-29 20:08:16 +00001804 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001805 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001806
Guido van Rossum2d951851994-08-29 12:52:16 +00001807 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001808 PyObject *op2;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001809
1810 if (args->ob_refcnt > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001811 Py_DECREF(args);
1812 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001813 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001814 }
1815
Guido van Rossum2d951851994-08-29 12:52:16 +00001816 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001817 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001818 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001819 break;
1820 }
1821 goto Fail;
1822 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001823
Guido van Rossum2d951851994-08-29 12:52:16 +00001824 if (result == NULL)
1825 result = op2;
1826 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001827 PyTuple_SetItem(args, 0, result);
1828 PyTuple_SetItem(args, 1, op2);
1829 if ((result = PyEval_CallObject(func, args)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001830 goto Fail;
1831 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001832 }
1833
Guido van Rossum79f25d91997-04-29 20:08:16 +00001834 Py_DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001835
Guido van Rossum2d951851994-08-29 12:52:16 +00001836 if (result == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001837 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001838 "reduce of empty sequence with no initial value");
1839
Guido van Rossum12d12c51993-10-26 17:58:25 +00001840 return result;
1841
Guido van Rossum2d951851994-08-29 12:52:16 +00001842Fail:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001843 Py_XDECREF(args);
1844 Py_XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001845 return NULL;
1846}
1847
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001848static char reduce_doc[] =
1849"reduce(function, sequence[, initial]) -> value\n\
1850\n\
1851Apply a function of two arguments cumulatively to the items of a sequence,\n\
1852from left to right, so as to reduce the sequence to a single value.\n\
1853For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\
1854((((1+2)+3)+4)+5). If initial is present, it is placed before the items\n\
1855of the sequence in the calculation, and serves as a default when the\n\
1856sequence is empty.";
1857
1858
Guido van Rossum79f25d91997-04-29 20:08:16 +00001859static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001860builtin_reload(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001861{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001862 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001863
Guido van Rossum79f25d91997-04-29 20:08:16 +00001864 if (!PyArg_ParseTuple(args, "O:reload", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001865 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001866 return PyImport_ReloadModule(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001867}
1868
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001869static char reload_doc[] =
1870"reload(module) -> module\n\
1871\n\
1872Reload the module. The module must have been successfully imported before.";
1873
1874
Guido van Rossum79f25d91997-04-29 20:08:16 +00001875static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001876builtin_repr(PyObject *self, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001877{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001878 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001879
Guido van Rossum79f25d91997-04-29 20:08:16 +00001880 if (!PyArg_ParseTuple(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001881 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001882 return PyObject_Repr(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001883}
1884
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001885static char repr_doc[] =
1886"repr(object) -> string\n\
1887\n\
1888Return the canonical string representation of the object.\n\
1889For most object types, eval(repr(object)) == object.";
1890
1891
Guido van Rossum79f25d91997-04-29 20:08:16 +00001892static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001893builtin_round(PyObject *self, PyObject *args)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001894{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001895 double x;
1896 double f;
1897 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001898 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001899
Guido van Rossum79f25d91997-04-29 20:08:16 +00001900 if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001901 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001902 f = 1.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001903 i = abs(ndigits);
1904 while (--i >= 0)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001905 f = f*10.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001906 if (ndigits < 0)
1907 x /= f;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001908 else
Guido van Rossum1e162d31998-05-09 14:42:25 +00001909 x *= f;
1910 if (x >= 0.0)
1911 x = floor(x + 0.5);
1912 else
1913 x = ceil(x - 0.5);
1914 if (ndigits < 0)
1915 x *= f;
1916 else
1917 x /= f;
1918 return PyFloat_FromDouble(x);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001919}
1920
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001921static char round_doc[] =
1922"round(number[, ndigits]) -> floating point number\n\
1923\n\
1924Round a number to a given precision in decimal digits (default 0 digits).\n\
1925This always returns a floating point number. Precision may be negative.";
1926
1927
Guido van Rossum79f25d91997-04-29 20:08:16 +00001928static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001929builtin_str(PyObject *self, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001930{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001931 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001932
Guido van Rossum79f25d91997-04-29 20:08:16 +00001933 if (!PyArg_ParseTuple(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001934 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001935 return PyObject_Str(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001936}
1937
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001938static char str_doc[] =
1939"str(object) -> string\n\
1940\n\
1941Return a nice string representation of the object.\n\
1942If the argument is a string, the return value is the same object.";
1943
1944
Guido van Rossum79f25d91997-04-29 20:08:16 +00001945static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001946builtin_tuple(PyObject *self, PyObject *args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001947{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001948 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001949
Guido van Rossum79f25d91997-04-29 20:08:16 +00001950 if (!PyArg_ParseTuple(args, "O:tuple", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001951 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001952 return PySequence_Tuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001953}
1954
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001955static char tuple_doc[] =
1956"tuple(sequence) -> list\n\
1957\n\
1958Return a tuple whose items are the same as those of the argument sequence.\n\
1959If the argument is a tuple, the return value is the same object.";
1960
1961
Guido van Rossum79f25d91997-04-29 20:08:16 +00001962static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001963builtin_type(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001964{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001965 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001966
Guido van Rossum79f25d91997-04-29 20:08:16 +00001967 if (!PyArg_ParseTuple(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001968 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001969 v = (PyObject *)v->ob_type;
1970 Py_INCREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001971 return v;
1972}
1973
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001974static char type_doc[] =
1975"type(object) -> type object\n\
1976\n\
1977Return the type of the object.";
1978
1979
Guido van Rossum79f25d91997-04-29 20:08:16 +00001980static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001981builtin_vars(PyObject *self, PyObject *args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001982{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001983 PyObject *v = NULL;
1984 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001985
Guido van Rossum79f25d91997-04-29 20:08:16 +00001986 if (!PyArg_ParseTuple(args, "|O:vars", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001987 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001988 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001989 d = PyEval_GetLocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001990 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001991 if (!PyErr_Occurred())
1992 PyErr_SetString(PyExc_SystemError,
1993 "no locals!?");
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001994 }
1995 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001996 Py_INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00001997 }
1998 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001999 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum2d951851994-08-29 12:52:16 +00002000 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002001 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00002002 "vars() argument must have __dict__ attribute");
2003 return NULL;
2004 }
2005 }
2006 return d;
2007}
2008
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002009static char vars_doc[] =
2010"vars([object]) -> dictionary\n\
2011\n\
2012Without arguments, equivalent to locals().\n\
2013With an argument, equivalent to object.__dict__.";
2014
Guido van Rossum668213d1999-06-16 17:28:37 +00002015static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002016abstract_issubclass(PyObject *derived, PyObject *cls, char *err, int first)
Guido van Rossum668213d1999-06-16 17:28:37 +00002017{
2018 static PyObject *__bases__ = NULL;
2019 PyObject *bases;
Guido van Rossum7f851861999-06-17 19:12:39 +00002020 int i, n;
Guido van Rossum668213d1999-06-16 17:28:37 +00002021 int r = 0;
2022
2023 if (__bases__ == NULL) {
2024 __bases__ = PyString_FromString("__bases__");
2025 if (__bases__ == NULL)
2026 return -1;
2027 }
2028
2029 if (first) {
2030 bases = PyObject_GetAttr(cls, __bases__);
2031 if (bases == NULL || !PyTuple_Check(bases)) {
2032 Py_XDECREF(bases);
2033 PyErr_SetString(PyExc_TypeError, err);
2034 return -1;
2035 }
2036 Py_DECREF(bases);
2037 }
2038
2039 if (derived == cls)
2040 return 1;
2041
2042 bases = PyObject_GetAttr(derived, __bases__);
2043 if (bases == NULL || !PyTuple_Check(bases)) {
2044 Py_XDECREF(bases);
2045 PyErr_SetString(PyExc_TypeError, err);
2046 return -1;
2047 }
2048
2049 n = PyTuple_GET_SIZE(bases);
2050 for (i = 0; i < n; i++) {
2051 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i),
2052 cls, err, 0);
2053 if (r != 0)
2054 break;
2055 }
2056
2057 Py_DECREF(bases);
2058
2059 return r;
2060}
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002061
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002062static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002063builtin_isinstance(PyObject *self, PyObject *args)
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002064{
2065 PyObject *inst;
2066 PyObject *cls;
Guido van Rossum668213d1999-06-16 17:28:37 +00002067 PyObject *icls;
2068 static PyObject *__class__ = NULL;
2069 int retval = 0;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002070
Guido van Rossum43713e52000-02-29 13:59:29 +00002071 if (!PyArg_ParseTuple(args, "OO:isinstance", &inst, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002072 return NULL;
Guido van Rossumf5dd9141997-12-02 19:11:45 +00002073
Guido van Rossum668213d1999-06-16 17:28:37 +00002074 if (PyClass_Check(cls)) {
2075 if (PyInstance_Check(inst)) {
Guido van Rossumf5dd9141997-12-02 19:11:45 +00002076 PyObject *inclass =
2077 (PyObject*)((PyInstanceObject*)inst)->in_class;
2078 retval = PyClass_IsSubclass(inclass, cls);
2079 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002080 }
Guido van Rossum668213d1999-06-16 17:28:37 +00002081 else if (PyType_Check(cls)) {
2082 retval = ((PyObject *)(inst->ob_type) == cls);
2083 }
2084 else if (!PyInstance_Check(inst)) {
2085 if (__class__ == NULL) {
2086 __class__ = PyString_FromString("__class__");
2087 if (__class__ == NULL)
2088 return NULL;
2089 }
2090 icls = PyObject_GetAttr(inst, __class__);
2091 if (icls != NULL) {
2092 retval = abstract_issubclass(
2093 icls, cls,
2094 "second argument must be a class",
2095 1);
2096 Py_DECREF(icls);
2097 if (retval < 0)
2098 return NULL;
2099 }
2100 else {
2101 PyErr_SetString(PyExc_TypeError,
2102 "second argument must be a class");
2103 return NULL;
2104 }
2105 }
2106 else {
2107 PyErr_SetString(PyExc_TypeError,
2108 "second argument must be a class");
2109 return NULL;
2110 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002111 return PyInt_FromLong(retval);
2112}
2113
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002114static char isinstance_doc[] =
2115"isinstance(object, class-or-type) -> Boolean\n\
2116\n\
2117Return whether an object is an instance of a class or of a subclass thereof.\n\
2118With a type as second argument, return whether that is the object's type.";
2119
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002120
2121static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002122builtin_issubclass(PyObject *self, PyObject *args)
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002123{
2124 PyObject *derived;
2125 PyObject *cls;
2126 int retval;
2127
Guido van Rossum43713e52000-02-29 13:59:29 +00002128 if (!PyArg_ParseTuple(args, "OO:issubclass", &derived, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002129 return NULL;
Guido van Rossum668213d1999-06-16 17:28:37 +00002130
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002131 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossum668213d1999-06-16 17:28:37 +00002132 retval = abstract_issubclass(
2133 derived, cls, "arguments must be classes", 1);
2134 if (retval < 0)
2135 return NULL;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002136 }
Guido van Rossum668213d1999-06-16 17:28:37 +00002137 else {
2138 /* shortcut */
2139 if (!(retval = (derived == cls)))
2140 retval = PyClass_IsSubclass(derived, cls);
2141 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002142
2143 return PyInt_FromLong(retval);
2144}
2145
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002146static char issubclass_doc[] =
2147"issubclass(C, B) -> Boolean\n\
2148\n\
2149Return whether class C is a subclass (i.e., a derived class) of class B.";
2150
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002151
Barry Warsawbd599b52000-08-03 15:45:29 +00002152static PyObject*
2153builtin_zip(PyObject *self, PyObject *args)
2154{
2155 PyObject *ret;
2156 int itemsize = PySequence_Length(args);
2157 int i, j;
2158
2159 if (itemsize < 1) {
2160 PyErr_SetString(PyExc_TypeError,
2161 "at least one sequence is required");
2162 return NULL;
2163 }
2164 /* args must be a tuple */
2165 assert(PyTuple_Check(args));
2166
2167 if ((ret = PyList_New(0)) == NULL)
2168 return NULL;
2169
2170 for (i = 0;; i++) {
2171 PyObject *next = PyTuple_New(itemsize);
2172 if (!next) {
2173 Py_DECREF(ret);
2174 return NULL;
2175 }
2176 for (j = 0; j < itemsize; j++) {
2177 PyObject *seq = PyTuple_GET_ITEM(args, j);
2178 PyObject *item = PySequence_GetItem(seq, i);
2179
2180 if (!item) {
2181 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2182 PyErr_Clear();
2183 Py_DECREF(next);
2184 return ret;
2185 }
2186 Py_DECREF(next);
2187 Py_DECREF(ret);
2188 return NULL;
2189 }
2190 PyTuple_SET_ITEM(next, j, item);
2191 }
2192 PyList_Append(ret, next);
2193 Py_DECREF(next);
2194 }
2195 /* no return */
2196}
2197
2198
2199static char zip_doc[] =
2200"zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]\n\
2201\n\
2202Return a list of tuples, where each tuple contains the i-th element\n\
2203from each of the argument sequences. The returned list is truncated\n\
2204in length to the length of the shortest argument sequence.";
2205
2206
Guido van Rossum79f25d91997-04-29 20:08:16 +00002207static PyMethodDef builtin_methods[] = {
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002208 {"__import__", builtin___import__, 1, import_doc},
2209 {"abs", builtin_abs, 1, abs_doc},
2210 {"apply", builtin_apply, 1, apply_doc},
Guido van Rossum0daf0221999-03-19 19:07:19 +00002211 {"buffer", builtin_buffer, 1, buffer_doc},
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002212 {"callable", builtin_callable, 1, callable_doc},
2213 {"chr", builtin_chr, 1, chr_doc},
2214 {"cmp", builtin_cmp, 1, cmp_doc},
2215 {"coerce", builtin_coerce, 1, coerce_doc},
2216 {"compile", builtin_compile, 1, compile_doc},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00002217#ifndef WITHOUT_COMPLEX
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002218 {"complex", builtin_complex, 1, complex_doc},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00002219#endif
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002220 {"delattr", builtin_delattr, 1, delattr_doc},
2221 {"dir", builtin_dir, 1, dir_doc},
2222 {"divmod", builtin_divmod, 1, divmod_doc},
2223 {"eval", builtin_eval, 1, eval_doc},
2224 {"execfile", builtin_execfile, 1, execfile_doc},
2225 {"filter", builtin_filter, 1, filter_doc},
2226 {"float", builtin_float, 1, float_doc},
2227 {"getattr", builtin_getattr, 1, getattr_doc},
2228 {"globals", builtin_globals, 1, globals_doc},
2229 {"hasattr", builtin_hasattr, 1, hasattr_doc},
2230 {"hash", builtin_hash, 1, hash_doc},
2231 {"hex", builtin_hex, 1, hex_doc},
2232 {"id", builtin_id, 1, id_doc},
2233 {"input", builtin_input, 1, input_doc},
2234 {"intern", builtin_intern, 1, intern_doc},
2235 {"int", builtin_int, 1, int_doc},
2236 {"isinstance", builtin_isinstance, 1, isinstance_doc},
2237 {"issubclass", builtin_issubclass, 1, issubclass_doc},
2238 {"len", builtin_len, 1, len_doc},
2239 {"list", builtin_list, 1, list_doc},
2240 {"locals", builtin_locals, 1, locals_doc},
2241 {"long", builtin_long, 1, long_doc},
2242 {"map", builtin_map, 1, map_doc},
2243 {"max", builtin_max, 1, max_doc},
2244 {"min", builtin_min, 1, min_doc},
2245 {"oct", builtin_oct, 1, oct_doc},
2246 {"open", builtin_open, 1, open_doc},
2247 {"ord", builtin_ord, 1, ord_doc},
2248 {"pow", builtin_pow, 1, pow_doc},
2249 {"range", builtin_range, 1, range_doc},
2250 {"raw_input", builtin_raw_input, 1, raw_input_doc},
2251 {"reduce", builtin_reduce, 1, reduce_doc},
2252 {"reload", builtin_reload, 1, reload_doc},
2253 {"repr", builtin_repr, 1, repr_doc},
2254 {"round", builtin_round, 1, round_doc},
2255 {"setattr", builtin_setattr, 1, setattr_doc},
2256 {"slice", builtin_slice, 1, slice_doc},
2257 {"str", builtin_str, 1, str_doc},
2258 {"tuple", builtin_tuple, 1, tuple_doc},
2259 {"type", builtin_type, 1, type_doc},
Guido van Rossum09095f32000-03-10 23:00:52 +00002260 {"unicode", builtin_unicode, 1, unicode_doc},
2261 {"unichr", builtin_unichr, 1, unichr_doc},
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002262 {"vars", builtin_vars, 1, vars_doc},
2263 {"xrange", builtin_xrange, 1, xrange_doc},
Barry Warsawbd599b52000-08-03 15:45:29 +00002264 {"zip", builtin_zip, 1, zip_doc},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00002265 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00002266};
2267
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002268static char builtin_doc[] =
2269"Built-in functions, exceptions, and other objects.\n\
2270\n\
2271Noteworthy: None is the `nil' object; Ellipsis represents `...' in slices.";
2272
Guido van Rossum25ce5661997-08-02 03:10:38 +00002273PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002274_PyBuiltin_Init(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002275{
Fred Drake5550de32000-06-20 04:54:19 +00002276 PyObject *mod, *dict, *debug;
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002277 mod = Py_InitModule4("__builtin__", builtin_methods,
2278 builtin_doc, (PyObject *)NULL,
2279 PYTHON_API_VERSION);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002280 if (mod == NULL)
2281 return NULL;
2282 dict = PyModule_GetDict(mod);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002283 if (PyDict_SetItemString(dict, "None", Py_None) < 0)
2284 return NULL;
2285 if (PyDict_SetItemString(dict, "Ellipsis", Py_Ellipsis) < 0)
2286 return NULL;
Fred Drake5550de32000-06-20 04:54:19 +00002287 debug = PyInt_FromLong(Py_OptimizeFlag == 0);
2288 if (PyDict_SetItemString(dict, "__debug__", debug) < 0) {
2289 Py_XDECREF(debug);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002290 return NULL;
Fred Drake5550de32000-06-20 04:54:19 +00002291 }
2292 Py_XDECREF(debug);
Barry Warsaw757af0e1997-08-29 22:13:51 +00002293
Guido van Rossum25ce5661997-08-02 03:10:38 +00002294 return mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002295}
2296
Guido van Rossume77a7571993-11-03 15:01:26 +00002297/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00002298
Guido van Rossum79f25d91997-04-29 20:08:16 +00002299static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002300filtertuple(PyObject *func, PyObject *tuple)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002301{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002302 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002303 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002304 int len = PyTuple_Size(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002305
Guido van Rossumb7b45621995-08-04 04:07:45 +00002306 if (len == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002307 Py_INCREF(tuple);
Guido van Rossumb7b45621995-08-04 04:07:45 +00002308 return tuple;
2309 }
2310
Guido van Rossum79f25d91997-04-29 20:08:16 +00002311 if ((result = PyTuple_New(len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00002312 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002313
Guido van Rossum12d12c51993-10-26 17:58:25 +00002314 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002315 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002316 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002317
Guido van Rossum79f25d91997-04-29 20:08:16 +00002318 if ((item = PyTuple_GetItem(tuple, i)) == NULL)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002319 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002320 if (func == Py_None) {
2321 Py_INCREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002322 good = item;
2323 }
2324 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002325 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002326 if (arg == NULL)
2327 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002328 good = PyEval_CallObject(func, arg);
2329 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002330 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002331 goto Fail_1;
2332 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002333 ok = PyObject_IsTrue(good);
2334 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002335 if (ok) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002336 Py_INCREF(item);
2337 if (PyTuple_SetItem(result, j++, item) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002338 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002339 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00002340 }
2341
Guido van Rossum79f25d91997-04-29 20:08:16 +00002342 if (_PyTuple_Resize(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002343 return NULL;
2344
Guido van Rossum12d12c51993-10-26 17:58:25 +00002345 return result;
2346
Guido van Rossum12d12c51993-10-26 17:58:25 +00002347Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002348 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002349 return NULL;
2350}
2351
2352
Guido van Rossume77a7571993-11-03 15:01:26 +00002353/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00002354
Guido van Rossum79f25d91997-04-29 20:08:16 +00002355static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002356filterstring(PyObject *func, PyObject *strobj)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002357{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002358 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002359 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002360 int len = PyString_Size(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002361
Guido van Rossum79f25d91997-04-29 20:08:16 +00002362 if (func == Py_None) {
Guido van Rossum2586bf01993-11-01 16:21:44 +00002363 /* No character is ever false -- share input string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002364 Py_INCREF(strobj);
Guido van Rossum2d951851994-08-29 12:52:16 +00002365 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002366 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002367 if ((result = PyString_FromStringAndSize(NULL, len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00002368 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002369
Guido van Rossum12d12c51993-10-26 17:58:25 +00002370 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002371 PyObject *item, *arg, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002372 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002373
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002374 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
2375 if (item == NULL)
2376 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002377 arg = Py_BuildValue("(O)", item);
2378 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002379 if (arg == NULL)
2380 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002381 good = PyEval_CallObject(func, arg);
2382 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002383 if (good == NULL)
2384 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002385 ok = PyObject_IsTrue(good);
2386 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002387 if (ok)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002388 PyString_AS_STRING((PyStringObject *)result)[j++] =
2389 PyString_AS_STRING((PyStringObject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00002390 }
2391
Guido van Rossum79f25d91997-04-29 20:08:16 +00002392 if (j < len && _PyString_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002393 return NULL;
2394
Guido van Rossum12d12c51993-10-26 17:58:25 +00002395 return result;
2396
Guido van Rossum12d12c51993-10-26 17:58:25 +00002397Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002398 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002399 return NULL;
2400}