blob: 82867e0f43914c063d4153623b4f1fed26c366b5 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum3f5da241990-12-20 15:06:42 +000011/* Built-in functions */
12
Guido van Rossum79f25d91997-04-29 20:08:16 +000013#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000014
15#include "node.h"
Guido van Rossum5b722181993-03-30 17:46:03 +000016#include "compile.h"
17#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000018
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +000019#include "mymath.h"
20
Guido van Rossum6bf62da1997-04-11 20:37:35 +000021#include <ctype.h>
22
Guido van Rossum1a2c5cb1996-12-10 15:37:36 +000023#ifdef HAVE_UNISTD_H
24#include <unistd.h>
25#endif
Jack Jansen41aa8e52000-07-03 21:39:47 +000026#ifdef HAVE_LIMITS_H
27#include <limits.h>
28#endif
Guido van Rossum1a2c5cb1996-12-10 15:37:36 +000029
Guido van Rossum12d12c51993-10-26 17:58:25 +000030/* Forward */
Guido van Rossum79f25d91997-04-29 20:08:16 +000031static PyObject *filterstring Py_PROTO((PyObject *, PyObject *));
32static PyObject *filtertuple Py_PROTO((PyObject *, PyObject *));
Guido van Rossum12d12c51993-10-26 17:58:25 +000033
Guido van Rossum79f25d91997-04-29 20:08:16 +000034static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +000035builtin___import__(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +000036 PyObject *self;
37 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +000038{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000039 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +000040 PyObject *globals = NULL;
41 PyObject *locals = NULL;
42 PyObject *fromlist = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000043
Guido van Rossum79f25d91997-04-29 20:08:16 +000044 if (!PyArg_ParseTuple(args, "s|OOO:__import__",
Guido van Rossum24c13741995-02-14 09:42:43 +000045 &name, &globals, &locals, &fromlist))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000046 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +000047 return PyImport_ImportModuleEx(name, globals, locals, fromlist);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000048}
49
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +000050static char import_doc[] =
51"__import__(name, globals, locals, fromlist) -> module\n\
52\n\
53Import a module. The globals are only used to determine the context;\n\
54they are not modified. The locals are currently unused. The fromlist\n\
55should be a list of names to emulate ``from name import ...'', or an\n\
56empty list to emulate ``import name''.\n\
57When importing a module from a package, note that __import__('A.B', ...)\n\
58returns package A when fromlist is empty, but its submodule B when\n\
59fromlist is not empty.";
60
Guido van Rossum1ae940a1995-01-02 19:04:15 +000061
Guido van Rossum79f25d91997-04-29 20:08:16 +000062static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +000063builtin_abs(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +000064 PyObject *self;
65 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000066{
Guido van Rossum79f25d91997-04-29 20:08:16 +000067 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000068
Guido van Rossum79f25d91997-04-29 20:08:16 +000069 if (!PyArg_ParseTuple(args, "O:abs", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000070 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +000071 return PyNumber_Absolute(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000072}
73
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +000074static char abs_doc[] =
75"abs(number) -> number\n\
76\n\
77Return the absolute value of the argument.";
78
79
Guido van Rossum79f25d91997-04-29 20:08:16 +000080static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +000081builtin_apply(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +000082 PyObject *self;
83 PyObject *args;
Guido van Rossumc02e15c1991-12-16 13:03:00 +000084{
Guido van Rossum79f25d91997-04-29 20:08:16 +000085 PyObject *func, *alist = NULL, *kwdict = NULL;
Barry Warsaw968f8cb1998-10-01 15:33:12 +000086 PyObject *t = NULL, *retval = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000087
Guido van Rossum79f25d91997-04-29 20:08:16 +000088 if (!PyArg_ParseTuple(args, "O|OO:apply", &func, &alist, &kwdict))
Guido van Rossumc02e15c1991-12-16 13:03:00 +000089 return NULL;
Barry Warsaw968f8cb1998-10-01 15:33:12 +000090 if (alist != NULL) {
91 if (!PyTuple_Check(alist)) {
92 if (!PySequence_Check(alist)) {
93 PyErr_SetString(PyExc_TypeError,
94 "apply() 2nd argument must be a sequence");
95 return NULL;
96 }
97 t = PySequence_Tuple(alist);
98 if (t == NULL)
99 return NULL;
100 alist = t;
101 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000102 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000103 if (kwdict != NULL && !PyDict_Check(kwdict)) {
104 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000105 "apply() 3rd argument must be dictionary");
Barry Warsaw968f8cb1998-10-01 15:33:12 +0000106 goto finally;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000107 }
Barry Warsaw968f8cb1998-10-01 15:33:12 +0000108 retval = PyEval_CallObjectWithKeywords(func, alist, kwdict);
109 finally:
110 Py_XDECREF(t);
111 return retval;
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000112}
113
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000114static char apply_doc[] =
Fred Drake7b912121999-12-23 14:16:55 +0000115"apply(object, args[, kwargs]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000116\n\
Fred Drake7b912121999-12-23 14:16:55 +0000117Call a callable object with positional arguments taken from the tuple args,\n\
118and keyword arguments taken from the optional dictionary kwargs.\n\
119Note that classes are callable, as are instances with a __call__() method.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000120
121
Guido van Rossum79f25d91997-04-29 20:08:16 +0000122static PyObject *
Guido van Rossum0daf0221999-03-19 19:07:19 +0000123builtin_buffer(self, args)
124 PyObject *self;
125 PyObject *args;
126{
127 PyObject *ob;
128 int offset = 0;
129 int size = Py_END_OF_BUFFER;
130
131 if ( !PyArg_ParseTuple(args, "O|ii:buffer", &ob, &offset, &size) )
132 return NULL;
133 return PyBuffer_FromObject(ob, offset, size);
134}
135
136static char buffer_doc[] =
Guido van Rossum09095f32000-03-10 23:00:52 +0000137"buffer(object [, offset[, size]]) -> object\n\
Guido van Rossum0daf0221999-03-19 19:07:19 +0000138\n\
139Creates a new buffer object which references the given object.\n\
140The buffer will reference a slice of the target object from the\n\
141start of the object (or at the specified offset). The slice will\n\
142extend to the end of the target object (or with the specified size).";
143
144
145static PyObject *
Guido van Rossum09095f32000-03-10 23:00:52 +0000146builtin_unicode(self, args)
147 PyObject *self;
148 PyObject *args;
149{
Guido van Rossum3afba762000-04-11 15:38:23 +0000150 PyObject *v;
151 const void *buffer;
Guido van Rossum09095f32000-03-10 23:00:52 +0000152 int len;
153 char *encoding = NULL;
154 char *errors = NULL;
155
Guido van Rossum3afba762000-04-11 15:38:23 +0000156 if ( !PyArg_ParseTuple(args, "O|ss:unicode", &v, &encoding, &errors) )
Guido van Rossum09095f32000-03-10 23:00:52 +0000157 return NULL;
Guido van Rossum3afba762000-04-11 15:38:23 +0000158 /* Special case: Unicode will stay Unicode */
159 if (PyUnicode_Check(v)) {
160 if (encoding) {
161 PyErr_SetString(PyExc_TypeError,
162 "unicode() does not support decoding of Unicode objects");
163 return NULL;
164 }
165 Py_INCREF(v);
166 return v;
167 }
168 /* Read raw data and decode it */
169 if (PyObject_AsReadBuffer(v, &buffer, &len))
170 return NULL;
171 return PyUnicode_Decode((const char *)buffer, len, encoding, errors);
Guido van Rossum09095f32000-03-10 23:00:52 +0000172}
173
174static char unicode_doc[] =
175"unicode(string [, encoding[, errors]]) -> object\n\
176\n\
Fred Drake078b24f2000-04-13 02:42:50 +0000177Creates a new Unicode object from the given encoded string.\n\
Fred Drakec640b182000-05-09 19:55:16 +0000178encoding defaults to the current default string encoding and \n\
179errors, defining the error handling, to 'strict'.";
Guido van Rossum09095f32000-03-10 23:00:52 +0000180
181
182static PyObject *
Guido van Rossum2d951851994-08-29 12:52:16 +0000183builtin_callable(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000184 PyObject *self;
185 PyObject *args;
Guido van Rossum2d951851994-08-29 12:52:16 +0000186{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000187 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000188
Guido van Rossum79f25d91997-04-29 20:08:16 +0000189 if (!PyArg_ParseTuple(args, "O:callable", &v))
Guido van Rossum2d951851994-08-29 12:52:16 +0000190 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000191 return PyInt_FromLong((long)PyCallable_Check(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000192}
193
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000194static char callable_doc[] =
195"callable(object) -> Boolean\n\
196\n\
197Return whether the object is callable (i.e., some kind of function).\n\
198Note that classes are callable, as are instances with a __call__() method.";
199
200
Guido van Rossum79f25d91997-04-29 20:08:16 +0000201static PyObject *
Guido van Rossume77a7571993-11-03 15:01:26 +0000202builtin_filter(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000203 PyObject *self;
204 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000205{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000206 PyObject *func, *seq, *result;
207 PySequenceMethods *sqf;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000208 int len;
209 register int i, j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000210
Guido van Rossum79f25d91997-04-29 20:08:16 +0000211 if (!PyArg_ParseTuple(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000212 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000213
Guido van Rossum79f25d91997-04-29 20:08:16 +0000214 if (PyString_Check(seq)) {
215 PyObject *r = filterstring(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000216 return r;
217 }
218
Guido van Rossum79f25d91997-04-29 20:08:16 +0000219 if (PyTuple_Check(seq)) {
220 PyObject *r = filtertuple(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000221 return r;
222 }
223
Guido van Rossum09df08a1998-05-22 00:51:39 +0000224 sqf = seq->ob_type->tp_as_sequence;
225 if (sqf == NULL || sqf->sq_length == NULL || sqf->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 PyErr_SetString(PyExc_TypeError,
Guido van Rossume77a7571993-11-03 15:01:26 +0000227 "argument 2 to filter() must be a sequence type");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000228 goto Fail_2;
229 }
230
231 if ((len = (*sqf->sq_length)(seq)) < 0)
232 goto Fail_2;
233
Guido van Rossum79f25d91997-04-29 20:08:16 +0000234 if (PyList_Check(seq) && seq->ob_refcnt == 1) {
235 Py_INCREF(seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000236 result = seq;
237 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000238 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000239 if ((result = PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000240 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000241 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000242
Guido van Rossum2d951851994-08-29 12:52:16 +0000243 for (i = j = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000245 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000246
Guido van Rossum2d951851994-08-29 12:52:16 +0000247 if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +0000248 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000249 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +0000250 break;
251 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000252 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000253 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000254
Guido van Rossum79f25d91997-04-29 20:08:16 +0000255 if (func == Py_None) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000256 good = item;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000257 Py_INCREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000258 }
259 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000260 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000261 if (arg == NULL)
262 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000263 good = PyEval_CallObject(func, arg);
264 Py_DECREF(arg);
Guido van Rossum58b68731995-01-10 17:40:55 +0000265 if (good == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000266 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000267 goto Fail_1;
Guido van Rossum58b68731995-01-10 17:40:55 +0000268 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000269 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 ok = PyObject_IsTrue(good);
271 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000272 if (ok) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000273 if (j < len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000274 if (PyList_SetItem(result, j++, item) < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000275 goto Fail_1;
276 }
277 else {
Barry Warsawfa77e091999-01-28 18:49:12 +0000278 int status = PyList_Append(result, item);
Guido van Rossum2d951851994-08-29 12:52:16 +0000279 j++;
Barry Warsawfa77e091999-01-28 18:49:12 +0000280 Py_DECREF(item);
281 if (status < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000282 goto Fail_1;
283 }
Guido van Rossum58b68731995-01-10 17:40:55 +0000284 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000285 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000286 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000287 }
288
Guido van Rossum12d12c51993-10-26 17:58:25 +0000289
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 if (j < len && PyList_SetSlice(result, j, len, NULL) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000291 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000292
Guido van Rossum12d12c51993-10-26 17:58:25 +0000293 return result;
294
Guido van Rossum12d12c51993-10-26 17:58:25 +0000295Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000296 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000297Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000298 return NULL;
299}
300
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000301static char filter_doc[] =
302"filter(function, sequence) -> list\n\
303\n\
304Return a list containing those items of sequence for which function(item)\n\
305is true. If function is None, return a list of items that are true.";
306
307
Guido van Rossum79f25d91997-04-29 20:08:16 +0000308static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +0000309builtin_chr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000310 PyObject *self;
311 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000312{
313 long x;
314 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000315
Guido van Rossum79f25d91997-04-29 20:08:16 +0000316 if (!PyArg_ParseTuple(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000317 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000318 if (x < 0 || x >= 256) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000319 PyErr_SetString(PyExc_ValueError,
320 "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000321 return NULL;
322 }
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000323 s[0] = (char)x;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000324 return PyString_FromStringAndSize(s, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000325}
326
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000327static char chr_doc[] =
328"chr(i) -> character\n\
329\n\
330Return a string of one character with ordinal i; 0 <= i < 256.";
331
332
Guido van Rossum79f25d91997-04-29 20:08:16 +0000333static PyObject *
Guido van Rossum09095f32000-03-10 23:00:52 +0000334builtin_unichr(self, args)
335 PyObject *self;
336 PyObject *args;
337{
338 long x;
339 Py_UNICODE s[1];
340
341 if (!PyArg_ParseTuple(args, "l:unichr", &x))
342 return NULL;
343 if (x < 0 || x >= 65536) {
344 PyErr_SetString(PyExc_ValueError,
345 "unichr() arg not in range(65536)");
346 return NULL;
347 }
348 s[0] = (Py_UNICODE)x;
349 return PyUnicode_FromUnicode(s, 1);
350}
351
352static char unichr_doc[] =
Fred Drake078b24f2000-04-13 02:42:50 +0000353"unichr(i) -> Unicode character\n\
Guido van Rossum09095f32000-03-10 23:00:52 +0000354\n\
Fred Drake078b24f2000-04-13 02:42:50 +0000355Return a Unicode string of one character with ordinal i; 0 <= i < 65536.";
Guido van Rossum09095f32000-03-10 23:00:52 +0000356
357
358static PyObject *
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000359builtin_cmp(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000360 PyObject *self;
361 PyObject *args;
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000362{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000363 PyObject *a, *b;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000364 int c;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000365
Guido van Rossum79f25d91997-04-29 20:08:16 +0000366 if (!PyArg_ParseTuple(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000367 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000368 if (PyObject_Cmp(a, b, &c) < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000369 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000370 return PyInt_FromLong((long)c);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000371}
372
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000373static char cmp_doc[] =
374"cmp(x, y) -> integer\n\
375\n\
376Return negative if x<y, zero if x==y, positive if x>y.";
377
378
Guido van Rossum79f25d91997-04-29 20:08:16 +0000379static PyObject *
Guido van Rossum5524a591995-01-10 15:26:20 +0000380builtin_coerce(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000381 PyObject *self;
382 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000383{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000384 PyObject *v, *w;
385 PyObject *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000386
Guido van Rossum79f25d91997-04-29 20:08:16 +0000387 if (!PyArg_ParseTuple(args, "OO:coerce", &v, &w))
Guido van Rossum5524a591995-01-10 15:26:20 +0000388 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000389 if (PyNumber_Coerce(&v, &w) < 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000390 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000391 res = Py_BuildValue("(OO)", v, w);
392 Py_DECREF(v);
393 Py_DECREF(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000394 return res;
395}
396
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000397static char coerce_doc[] =
398"coerce(x, y) -> None or (x1, y1)\n\
399\n\
400When x and y can be coerced to values of the same type, return a tuple\n\
401containing the coerced values. When they can't be coerced, return None.";
402
403
Guido van Rossum79f25d91997-04-29 20:08:16 +0000404static PyObject *
Guido van Rossum5b722181993-03-30 17:46:03 +0000405builtin_compile(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000406 PyObject *self;
407 PyObject *args;
Guido van Rossum5b722181993-03-30 17:46:03 +0000408{
409 char *str;
410 char *filename;
411 char *startstr;
412 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000413
Guido van Rossum79f25d91997-04-29 20:08:16 +0000414 if (!PyArg_ParseTuple(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000415 return NULL;
416 if (strcmp(startstr, "exec") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000417 start = Py_file_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000418 else if (strcmp(startstr, "eval") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000419 start = Py_eval_input;
Guido van Rossum872537c1995-07-07 22:43:42 +0000420 else if (strcmp(startstr, "single") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000421 start = Py_single_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000422 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000423 PyErr_SetString(PyExc_ValueError,
Guido van Rossum872537c1995-07-07 22:43:42 +0000424 "compile() mode must be 'exec' or 'eval' or 'single'");
Guido van Rossum5b722181993-03-30 17:46:03 +0000425 return NULL;
426 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000427 return Py_CompileString(str, filename, start);
Guido van Rossum5b722181993-03-30 17:46:03 +0000428}
429
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000430static char compile_doc[] =
431"compile(source, filename, mode) -> code object\n\
432\n\
433Compile the source string (a Python module, statement or expression)\n\
434into a code object that can be executed by the exec statement or eval().\n\
435The filename will be used for run-time error messages.\n\
436The mode must be 'exec' to compile a module, 'single' to compile a\n\
437single (interactive) statement, or 'eval' to compile an expression.";
438
439
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000440#ifndef WITHOUT_COMPLEX
441
Guido van Rossum79f25d91997-04-29 20:08:16 +0000442static PyObject *
Guido van Rossum11950231999-03-25 21:16:07 +0000443complex_from_string(v)
444 PyObject *v;
445{
446 extern double strtod Py_PROTO((const char *, char **));
Guido van Rossum9e896b32000-04-05 20:11:21 +0000447 const char *s, *start;
448 char *end;
Guido van Rossum11950231999-03-25 21:16:07 +0000449 double x=0.0, y=0.0, z;
450 int got_re=0, got_im=0, done=0;
451 int digit_or_dot;
452 int sw_error=0;
453 int sign;
454 char buffer[256]; /* For errors */
Guido van Rossum9e896b32000-04-05 20:11:21 +0000455 int len;
Guido van Rossum11950231999-03-25 21:16:07 +0000456
Guido van Rossum9e896b32000-04-05 20:11:21 +0000457 if (PyString_Check(v)) {
458 s = PyString_AS_STRING(v);
459 len = PyString_GET_SIZE(v);
460 }
461 else if (PyUnicode_Check(v)) {
462 char s_buffer[256];
463
464 if (PyUnicode_GET_SIZE(v) >= sizeof(s_buffer)) {
465 PyErr_SetString(PyExc_ValueError,
466 "complex() literal too large to convert");
467 return NULL;
468 }
469 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
470 PyUnicode_GET_SIZE(v),
471 s_buffer,
472 NULL))
473 return NULL;
474 s = s_buffer;
475 len = strlen(s);
476 }
477 else if (PyObject_AsCharBuffer(v, &s, &len)) {
478 PyErr_SetString(PyExc_TypeError,
479 "complex() needs a string first argument");
480 return NULL;
481 }
Guido van Rossum11950231999-03-25 21:16:07 +0000482
483 /* position on first nonblank */
Guido van Rossum9e896b32000-04-05 20:11:21 +0000484 start = s;
Guido van Rossum11950231999-03-25 21:16:07 +0000485 while (*s && isspace(Py_CHARMASK(*s)))
486 s++;
487 if (s[0] == '\0') {
488 PyErr_SetString(PyExc_ValueError,
489 "empty string for complex()");
490 return NULL;
491 }
492
493 z = -1.0;
494 sign = 1;
495 do {
496
497 switch (*s) {
498
499 case '\0':
Guido van Rossum9e896b32000-04-05 20:11:21 +0000500 if (s-start != len) {
Guido van Rossum11950231999-03-25 21:16:07 +0000501 PyErr_SetString(
502 PyExc_ValueError,
503 "null byte in argument for complex()");
504 return NULL;
505 }
506 if(!done) sw_error=1;
507 break;
508
509 case '-':
510 sign = -1;
511 /* Fallthrough */
512 case '+':
513 if (done) sw_error=1;
514 s++;
515 if ( *s=='\0'||*s=='+'||*s=='-' ||
516 isspace(Py_CHARMASK(*s)) ) sw_error=1;
517 break;
518
519 case 'J':
520 case 'j':
521 if (got_im || done) {
522 sw_error = 1;
523 break;
524 }
525 if (z<0.0) {
526 y=sign;
527 }
528 else{
529 y=sign*z;
530 }
531 got_im=1;
532 s++;
533 if (*s!='+' && *s!='-' )
534 done=1;
535 break;
536
537 default:
538 if (isspace(Py_CHARMASK(*s))) {
539 while (*s && isspace(Py_CHARMASK(*s)))
540 s++;
541 if (s[0] != '\0')
542 sw_error=1;
543 else
544 done = 1;
545 break;
546 }
547 digit_or_dot =
548 (*s=='.' || isdigit(Py_CHARMASK(*s)));
549 if (done||!digit_or_dot) {
550 sw_error=1;
551 break;
552 }
553 errno = 0;
554 PyFPE_START_PROTECT("strtod", return 0)
555 z = strtod(s, &end) ;
556 PyFPE_END_PROTECT(z)
557 if (errno != 0) {
558 sprintf(buffer,
559 "float() out of range: %.150s", s);
560 PyErr_SetString(
561 PyExc_ValueError,
562 buffer);
563 return NULL;
564 }
565 s=end;
566 if (*s=='J' || *s=='j') {
567
568 break;
569 }
570 if (got_re) {
571 sw_error=1;
572 break;
573 }
574
575 /* accept a real part */
576 x=sign*z;
577 got_re=1;
578 if (got_im) done=1;
579 z = -1.0;
580 sign = 1;
581 break;
582
583 } /* end of switch */
584
585 } while (*s!='\0' && !sw_error);
586
587 if (sw_error) {
588 PyErr_SetString(PyExc_ValueError,
589 "malformed string for complex()");
590 return NULL;
591 }
592
593 return PyComplex_FromDoubles(x,y);
594}
595
596static PyObject *
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000597builtin_complex(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000598 PyObject *self;
599 PyObject *args;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000600{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000601 PyObject *r, *i, *tmp;
602 PyNumberMethods *nbr, *nbi = NULL;
Guido van Rossum530956d1996-07-21 02:27:43 +0000603 Py_complex cr, ci;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000604 int own_r = 0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000605
606 i = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000607 if (!PyArg_ParseTuple(args, "O|O:complex", &r, &i))
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000608 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000609 if (PyString_Check(r) || PyUnicode_Check(r))
Guido van Rossum11950231999-03-25 21:16:07 +0000610 return complex_from_string(r);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000611 if ((nbr = r->ob_type->tp_as_number) == NULL ||
Guido van Rossumc6472e91997-03-31 17:15:43 +0000612 nbr->nb_float == NULL ||
613 (i != NULL &&
614 ((nbi = i->ob_type->tp_as_number) == NULL ||
615 nbi->nb_float == NULL))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000616 PyErr_SetString(PyExc_TypeError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000617 "complex() argument can't be converted to complex");
618 return NULL;
619 }
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000620 /* XXX Hack to support classes with __complex__ method */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000621 if (PyInstance_Check(r)) {
622 static PyObject *complexstr;
623 PyObject *f;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000624 if (complexstr == NULL) {
Guido van Rossum8d751611997-01-18 08:04:16 +0000625 complexstr = PyString_InternFromString("__complex__");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000626 if (complexstr == NULL)
627 return NULL;
628 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000629 f = PyObject_GetAttr(r, complexstr);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000630 if (f == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000631 PyErr_Clear();
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000632 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000633 PyObject *args = Py_BuildValue("()");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000634 if (args == NULL)
635 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000636 r = PyEval_CallObject(f, args);
637 Py_DECREF(args);
Barry Warsawf988e681999-01-27 23:13:59 +0000638 Py_DECREF(f);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000639 if (r == NULL)
640 return NULL;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000641 own_r = 1;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000642 }
643 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000644 if (PyComplex_Check(r)) {
645 cr = ((PyComplexObject*)r)->cval;
Guido van Rossum730806d1998-04-10 22:27:42 +0000646 if (own_r) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000647 Py_DECREF(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000648 }
Guido van Rossumc6472e91997-03-31 17:15:43 +0000649 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000650 else {
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000651 tmp = (*nbr->nb_float)(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000652 if (own_r) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000653 Py_DECREF(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000654 }
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000655 if (tmp == NULL)
656 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000657 cr.real = PyFloat_AsDouble(tmp);
658 Py_DECREF(tmp);
Guido van Rossum11950231999-03-25 21:16:07 +0000659 cr.imag = 0.0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000660 }
661 if (i == NULL) {
Guido van Rossum11950231999-03-25 21:16:07 +0000662 ci.real = 0.0;
663 ci.imag = 0.0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000664 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000665 else if (PyComplex_Check(i))
666 ci = ((PyComplexObject*)i)->cval;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000667 else {
Guido van Rossumc6472e91997-03-31 17:15:43 +0000668 tmp = (*nbi->nb_float)(i);
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000669 if (tmp == NULL)
670 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000671 ci.real = PyFloat_AsDouble(tmp);
672 Py_DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000673 ci.imag = 0.;
674 }
675 cr.real -= ci.imag;
676 cr.imag += ci.real;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000677 return PyComplex_FromCComplex(cr);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000678}
679
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000680static char complex_doc[] =
681"complex(real[, imag]) -> complex number\n\
682\n\
683Create a complex number from a real part and an optional imaginary part.\n\
684This is equivalent to (real + imag*1j) where imag defaults to 0.";
685
686
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000687#endif
688
Guido van Rossum79f25d91997-04-29 20:08:16 +0000689static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000690builtin_dir(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000691 PyObject *self;
692 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000693{
Guido van Rossum666b17a1997-05-06 16:36:57 +0000694 static char *attrlist[] = {"__members__", "__methods__", NULL};
695 PyObject *v = NULL, *l = NULL, *m = NULL;
696 PyObject *d, *x;
697 int i;
698 char **s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000699
Guido van Rossum79f25d91997-04-29 20:08:16 +0000700 if (!PyArg_ParseTuple(args, "|O:dir", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000701 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000702 if (v == NULL) {
Guido van Rossum666b17a1997-05-06 16:36:57 +0000703 x = PyEval_GetLocals();
704 if (x == NULL)
705 goto error;
706 l = PyMapping_Keys(x);
707 if (l == NULL)
708 goto error;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000709 }
710 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000711 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum666b17a1997-05-06 16:36:57 +0000712 if (d == NULL)
Guido van Rossum795ba581996-05-23 22:49:07 +0000713 PyErr_Clear();
Guido van Rossum666b17a1997-05-06 16:36:57 +0000714 else {
715 l = PyMapping_Keys(d);
716 if (l == NULL)
717 PyErr_Clear();
718 Py_DECREF(d);
719 }
720 if (l == NULL) {
721 l = PyList_New(0);
722 if (l == NULL)
723 goto error;
724 }
725 for (s = attrlist; *s != NULL; s++) {
726 m = PyObject_GetAttrString(v, *s);
727 if (m == NULL) {
728 PyErr_Clear();
729 continue;
730 }
731 for (i = 0; ; i++) {
732 x = PySequence_GetItem(m, i);
733 if (x == NULL) {
734 PyErr_Clear();
735 break;
736 }
737 if (PyList_Append(l, x) != 0) {
738 Py_DECREF(x);
739 Py_DECREF(m);
740 goto error;
741 }
742 Py_DECREF(x);
743 }
744 Py_DECREF(m);
Guido van Rossum795ba581996-05-23 22:49:07 +0000745 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000746 }
Guido van Rossum666b17a1997-05-06 16:36:57 +0000747 if (PyList_Sort(l) != 0)
748 goto error;
749 return l;
750 error:
751 Py_XDECREF(l);
752 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000753}
754
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000755static char dir_doc[] =
756"dir([object]) -> list of strings\n\
757\n\
758Return an alphabetized list of names comprising (some of) the attributes\n\
759of the given object. Without an argument, the names in the current scope\n\
760are listed. With an instance argument, only the instance attributes are\n\
761returned. With a class argument, attributes of the base class are not\n\
762returned. For other types or arguments, this may list members or methods.";
763
764
Guido van Rossum79f25d91997-04-29 20:08:16 +0000765static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000766builtin_divmod(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000767 PyObject *self;
768 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000769{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000770 PyObject *v, *w;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000771
Guido van Rossum79f25d91997-04-29 20:08:16 +0000772 if (!PyArg_ParseTuple(args, "OO:divmod", &v, &w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000773 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000774 return PyNumber_Divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000775}
776
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000777static char divmod_doc[] =
778"divmod(x, y) -> (div, mod)\n\
779\n\
780Return the tuple ((x-x%y)/y, x%y). Invariant: div*y + mod == x.";
781
782
Guido van Rossum79f25d91997-04-29 20:08:16 +0000783static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000784builtin_eval(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000785 PyObject *self;
786 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000787{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000788 PyObject *cmd;
789 PyObject *globals = Py_None, *locals = Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000790 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000791
Guido van Rossum79f25d91997-04-29 20:08:16 +0000792 if (!PyArg_ParseTuple(args, "O|O!O!:eval",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000793 &cmd,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000794 &PyDict_Type, &globals,
795 &PyDict_Type, &locals))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000796 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000797 if (globals == Py_None) {
798 globals = PyEval_GetGlobals();
799 if (locals == Py_None)
800 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000801 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000802 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000803 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000804 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
805 if (PyDict_SetItemString(globals, "__builtins__",
806 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000807 return NULL;
808 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000809 if (PyCode_Check(cmd))
810 return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals);
811 if (!PyString_Check(cmd)) {
812 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000813 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000814 return NULL;
815 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000816 str = PyString_AsString(cmd);
Guido van Rossum106f2da2000-06-28 21:12:25 +0000817 if (strlen(str) != (size_t)PyString_Size(cmd)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000818 PyErr_SetString(PyExc_ValueError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000819 "embedded '\\0' in string arg");
820 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000821 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000822 while (*str == ' ' || *str == '\t')
823 str++;
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000824 return PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000825}
826
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000827static char eval_doc[] =
828"eval(source[, globals[, locals]]) -> value\n\
829\n\
830Evaluate the source in the context of globals and locals.\n\
831The source may be a string representing a Python expression\n\
832or a code object as returned by compile().\n\
833The globals and locals are dictionaries, defaulting to the current\n\
834globals and locals. If only globals is given, locals defaults to it.";
835
836
Guido van Rossum79f25d91997-04-29 20:08:16 +0000837static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000838builtin_execfile(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000839 PyObject *self;
840 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000841{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000842 char *filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000843 PyObject *globals = Py_None, *locals = Py_None;
844 PyObject *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000845 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000846
Guido van Rossum79f25d91997-04-29 20:08:16 +0000847 if (!PyArg_ParseTuple(args, "s|O!O!:execfile",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000848 &filename,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000849 &PyDict_Type, &globals,
850 &PyDict_Type, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000851 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000852 if (globals == Py_None) {
853 globals = PyEval_GetGlobals();
854 if (locals == Py_None)
855 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000856 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000857 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000858 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000859 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
860 if (PyDict_SetItemString(globals, "__builtins__",
861 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000862 return NULL;
863 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000864 Py_BEGIN_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000865 fp = fopen(filename, "r");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000866 Py_END_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000867 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000868 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000869 return NULL;
870 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000871 res = PyRun_File(fp, filename, Py_file_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000872 Py_BEGIN_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000873 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000874 Py_END_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000875 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000876}
877
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000878static char execfile_doc[] =
879"execfile(filename[, globals[, locals]])\n\
880\n\
881Read and execute a Python script from a file.\n\
882The globals and locals are dictionaries, defaulting to the current\n\
883globals and locals. If only globals is given, locals defaults to it.";
884
885
Guido van Rossum79f25d91997-04-29 20:08:16 +0000886static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +0000887builtin_getattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000888 PyObject *self;
889 PyObject *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000890{
Guido van Rossum950ff291998-06-29 13:38:57 +0000891 PyObject *v, *result, *dflt = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000892 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000893
Guido van Rossum950ff291998-06-29 13:38:57 +0000894 if (!PyArg_ParseTuple(args, "OS|O:getattr", &v, &name, &dflt))
Guido van Rossum33894be1992-01-27 16:53:09 +0000895 return NULL;
Guido van Rossum950ff291998-06-29 13:38:57 +0000896 result = PyObject_GetAttr(v, name);
897 if (result == NULL && dflt != NULL) {
898 PyErr_Clear();
899 Py_INCREF(dflt);
900 result = dflt;
901 }
902 return result;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000903}
904
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000905static char getattr_doc[] =
Guido van Rossum950ff291998-06-29 13:38:57 +0000906"getattr(object, name[, default]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000907\n\
Guido van Rossum950ff291998-06-29 13:38:57 +0000908Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\n\
909When a default argument is given, it is returned when the attribute doesn't\n\
910exist; without it, an exception is raised in that case.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000911
912
Guido van Rossum79f25d91997-04-29 20:08:16 +0000913static PyObject *
Guido van Rossum872537c1995-07-07 22:43:42 +0000914builtin_globals(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000915 PyObject *self;
916 PyObject *args;
Guido van Rossum872537c1995-07-07 22:43:42 +0000917{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000918 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +0000919
Guido van Rossum43713e52000-02-29 13:59:29 +0000920 if (!PyArg_ParseTuple(args, ":globals"))
Guido van Rossum872537c1995-07-07 22:43:42 +0000921 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000922 d = PyEval_GetGlobals();
923 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +0000924 return d;
925}
926
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000927static char globals_doc[] =
928"globals() -> dictionary\n\
929\n\
930Return the dictionary containing the current scope's global variables.";
931
932
Guido van Rossum79f25d91997-04-29 20:08:16 +0000933static PyObject *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000934builtin_hasattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000935 PyObject *self;
936 PyObject *args;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000937{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000938 PyObject *v;
939 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000940
Guido van Rossum79f25d91997-04-29 20:08:16 +0000941 if (!PyArg_ParseTuple(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000942 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000943 v = PyObject_GetAttr(v, name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000944 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000945 PyErr_Clear();
Guido van Rossum09df08a1998-05-22 00:51:39 +0000946 Py_INCREF(Py_False);
947 return Py_False;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000948 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000949 Py_DECREF(v);
Guido van Rossum09df08a1998-05-22 00:51:39 +0000950 Py_INCREF(Py_True);
951 return Py_True;
Guido van Rossum33894be1992-01-27 16:53:09 +0000952}
953
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000954static char hasattr_doc[] =
955"hasattr(object, name) -> Boolean\n\
956\n\
957Return whether the object has an attribute with the given name.\n\
958(This is done by calling getattr(object, name) and catching exceptions.)";
959
960
Guido van Rossum79f25d91997-04-29 20:08:16 +0000961static PyObject *
Guido van Rossum5b722181993-03-30 17:46:03 +0000962builtin_id(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000963 PyObject *self;
964 PyObject *args;
Guido van Rossum5b722181993-03-30 17:46:03 +0000965{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000966 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000967
Guido van Rossum79f25d91997-04-29 20:08:16 +0000968 if (!PyArg_ParseTuple(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000969 return NULL;
Guido van Rossum106f2da2000-06-28 21:12:25 +0000970 return PyLong_FromVoidPtr(v);
Guido van Rossum5b722181993-03-30 17:46:03 +0000971}
972
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000973static char id_doc[] =
974"id(object) -> integer\n\
975\n\
976Return the identity of an object. This is guaranteed to be unique among\n\
977simultaneously existing objects. (Hint: it's the object's memory address.)";
978
979
Guido van Rossum79f25d91997-04-29 20:08:16 +0000980static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000981builtin_map(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000982 PyObject *self;
983 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000984{
985 typedef struct {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000986 PyObject *seq;
987 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000988 int len;
989 } sequence;
990
Guido van Rossum79f25d91997-04-29 20:08:16 +0000991 PyObject *func, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000992 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000993 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000994 register int i, j;
995
Guido van Rossum79f25d91997-04-29 20:08:16 +0000996 n = PyTuple_Size(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000997 if (n < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000998 PyErr_SetString(PyExc_TypeError,
999 "map() requires at least two args");
Guido van Rossum12d12c51993-10-26 17:58:25 +00001000 return NULL;
1001 }
1002
Guido van Rossum79f25d91997-04-29 20:08:16 +00001003 func = PyTuple_GetItem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001004 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001005
Guido van Rossumfa4ac711998-07-10 17:37:30 +00001006 if (func == Py_None && n == 1) {
1007 /* map(None, S) is the same as list(S). */
1008 return PySequence_List(PyTuple_GetItem(args, 1));
1009 }
1010
Guido van Rossum79f25d91997-04-29 20:08:16 +00001011 if ((seqs = PyMem_NEW(sequence, n)) == NULL) {
1012 PyErr_NoMemory();
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001013 goto Fail_2;
1014 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001015
Guido van Rossum2d951851994-08-29 12:52:16 +00001016 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001017 int curlen;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001018 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001019
Guido van Rossum79f25d91997-04-29 20:08:16 +00001020 if ((sqp->seq = PyTuple_GetItem(args, i + 1)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001021 goto Fail_2;
1022
Guido van Rossum09df08a1998-05-22 00:51:39 +00001023 sqp->sqf = sqf = sqp->seq->ob_type->tp_as_sequence;
1024 if (sqf == NULL ||
1025 sqf->sq_length == NULL ||
1026 sqf->sq_item == NULL)
1027 {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001028 static char errmsg[] =
1029 "argument %d to map() must be a sequence object";
Guido van Rossum15e33a41997-04-30 19:00:27 +00001030 char errbuf[sizeof(errmsg) + 25];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001031
1032 sprintf(errbuf, errmsg, i+2);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001033 PyErr_SetString(PyExc_TypeError, errbuf);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001034 goto Fail_2;
1035 }
1036
1037 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
1038 goto Fail_2;
1039
1040 if (curlen > len)
1041 len = curlen;
1042 }
1043
Guido van Rossum79f25d91997-04-29 20:08:16 +00001044 if ((result = (PyObject *) PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001045 goto Fail_2;
1046
Guido van Rossum2d951851994-08-29 12:52:16 +00001047 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001048 PyObject *alist, *item=NULL, *value;
Guido van Rossum2d951851994-08-29 12:52:16 +00001049 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001050
Guido van Rossum79f25d91997-04-29 20:08:16 +00001051 if (func == Py_None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +00001052 alist = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001053 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001054 if ((alist = PyTuple_New(n)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001055 goto Fail_1;
1056 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001057
1058 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +00001059 if (sqp->len < 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001060 Py_INCREF(Py_None);
1061 item = Py_None;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001062 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001063 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001064 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +00001065 if (item == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001066 if (PyErr_ExceptionMatches(
1067 PyExc_IndexError))
1068 {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001069 PyErr_Clear();
1070 Py_INCREF(Py_None);
1071 item = Py_None;
Guido van Rossum2d951851994-08-29 12:52:16 +00001072 sqp->len = -1;
1073 }
1074 else {
1075 goto Fail_0;
1076 }
1077 }
1078 else
1079 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001080
Guido van Rossum12d12c51993-10-26 17:58:25 +00001081 }
Guido van Rossum32120311995-07-10 13:52:21 +00001082 if (!alist)
Guido van Rossum2d951851994-08-29 12:52:16 +00001083 break;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001084 if (PyTuple_SetItem(alist, j, item) < 0) {
1085 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001086 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +00001087 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001088 continue;
1089
1090 Fail_0:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001091 Py_XDECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001092 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001093 }
1094
Guido van Rossum32120311995-07-10 13:52:21 +00001095 if (!alist)
1096 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +00001097
1098 if (!any) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001099 Py_DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +00001100 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001101 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001102
Guido van Rossum79f25d91997-04-29 20:08:16 +00001103 if (func == Py_None)
Guido van Rossum32120311995-07-10 13:52:21 +00001104 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001105 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001106 value = PyEval_CallObject(func, alist);
1107 Py_DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001108 if (value == NULL)
1109 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +00001110 }
1111 if (i >= len) {
Barry Warsawfa77e091999-01-28 18:49:12 +00001112 int status = PyList_Append(result, value);
Barry Warsaw21332871999-01-28 04:21:35 +00001113 Py_DECREF(value);
Barry Warsawfa77e091999-01-28 18:49:12 +00001114 if (status < 0)
1115 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +00001116 }
1117 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001118 if (PyList_SetItem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001119 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001120 }
1121 }
1122
Guido van Rossumfa4ac711998-07-10 17:37:30 +00001123 if (i < len && PyList_SetSlice(result, i, len, NULL) < 0)
1124 goto Fail_1;
1125
Guido van Rossum79f25d91997-04-29 20:08:16 +00001126 PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001127 return result;
1128
Guido van Rossum12d12c51993-10-26 17:58:25 +00001129Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001130 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001131Fail_2:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001132 if (seqs) PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001133 return NULL;
1134}
1135
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001136static char map_doc[] =
1137"map(function, sequence[, sequence, ...]) -> list\n\
1138\n\
1139Return a list of the results of applying the function to the items of\n\
1140the argument sequence(s). If more than one sequence is given, the\n\
1141function is called with an argument list consisting of the corresponding\n\
1142item of each sequence, substituting None for missing values when not all\n\
1143sequences have the same length. If the function is None, return a list of\n\
1144the items of the sequence (or a list of tuples if more than one sequence).";
1145
1146
Guido van Rossum79f25d91997-04-29 20:08:16 +00001147static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +00001148builtin_setattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001149 PyObject *self;
1150 PyObject *args;
Guido van Rossum33894be1992-01-27 16:53:09 +00001151{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001152 PyObject *v;
1153 PyObject *name;
1154 PyObject *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001155
Guido van Rossum79f25d91997-04-29 20:08:16 +00001156 if (!PyArg_ParseTuple(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +00001157 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001158 if (PyObject_SetAttr(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +00001159 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001160 Py_INCREF(Py_None);
1161 return Py_None;
Guido van Rossum33894be1992-01-27 16:53:09 +00001162}
1163
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001164static char setattr_doc[] =
1165"setattr(object, name, value)\n\
1166\n\
1167Set a named attribute on an object; setattr(x, 'y', v) is equivalent to\n\
1168``x.y = v''.";
1169
1170
Guido van Rossum79f25d91997-04-29 20:08:16 +00001171static PyObject *
Guido van Rossum14144fc1994-08-29 12:53:40 +00001172builtin_delattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001173 PyObject *self;
1174 PyObject *args;
Guido van Rossum14144fc1994-08-29 12:53:40 +00001175{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001176 PyObject *v;
1177 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001178
Guido van Rossum79f25d91997-04-29 20:08:16 +00001179 if (!PyArg_ParseTuple(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +00001180 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001181 if (PyObject_SetAttr(v, name, (PyObject *)NULL) != 0)
Guido van Rossum14144fc1994-08-29 12:53:40 +00001182 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001183 Py_INCREF(Py_None);
1184 return Py_None;
Guido van Rossum14144fc1994-08-29 12:53:40 +00001185}
1186
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001187static char delattr_doc[] =
Guido van Rossumdf12a591998-11-23 22:13:04 +00001188"delattr(object, name)\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001189\n\
1190Delete a named attribute on an object; delattr(x, 'y') is equivalent to\n\
1191``del x.y''.";
1192
1193
Guido van Rossum79f25d91997-04-29 20:08:16 +00001194static PyObject *
Guido van Rossum9bfef441993-03-29 10:43:31 +00001195builtin_hash(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001196 PyObject *self;
1197 PyObject *args;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001198{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001199 PyObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001200 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001201
Guido van Rossum79f25d91997-04-29 20:08:16 +00001202 if (!PyArg_ParseTuple(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +00001203 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001204 x = PyObject_Hash(v);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001205 if (x == -1)
1206 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001207 return PyInt_FromLong(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001208}
1209
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001210static char hash_doc[] =
1211"hash(object) -> integer\n\
1212\n\
1213Return a hash value for the object. Two objects with the same value have\n\
1214the same hash value. The reverse is not necessarily true, but likely.";
1215
1216
Guido van Rossum79f25d91997-04-29 20:08:16 +00001217static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001218builtin_hex(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001219 PyObject *self;
1220 PyObject *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001221{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001222 PyObject *v;
1223 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001224
Guido van Rossum79f25d91997-04-29 20:08:16 +00001225 if (!PyArg_ParseTuple(args, "O:hex", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001226 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001227
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001228 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001229 nb->nb_hex == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001230 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001231 "hex() argument can't be converted to hex");
1232 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001233 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001234 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001235}
1236
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001237static char hex_doc[] =
1238"hex(number) -> string\n\
1239\n\
1240Return the hexadecimal representation of an integer or long integer.";
1241
1242
Guido van Rossum79f25d91997-04-29 20:08:16 +00001243static PyObject *builtin_raw_input Py_PROTO((PyObject *, PyObject *));
Guido van Rossum3165fe61992-09-25 21:59:05 +00001244
Guido van Rossum79f25d91997-04-29 20:08:16 +00001245static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001246builtin_input(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001247 PyObject *self;
1248 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001249{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001250 PyObject *line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001251 char *str;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001252 PyObject *res;
1253 PyObject *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001254
1255 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001256 if (line == NULL)
1257 return line;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001258 if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001259 return NULL;
1260 while (*str == ' ' || *str == '\t')
1261 str++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001262 globals = PyEval_GetGlobals();
1263 locals = PyEval_GetLocals();
1264 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
1265 if (PyDict_SetItemString(globals, "__builtins__",
1266 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +00001267 return NULL;
1268 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00001269 res = PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001270 Py_DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001271 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001272}
1273
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001274static char input_doc[] =
1275"input([prompt]) -> value\n\
1276\n\
1277Equivalent to eval(raw_input(prompt)).";
1278
1279
Guido van Rossume8811f81997-02-14 15:48:05 +00001280static PyObject *
1281builtin_intern(self, args)
1282 PyObject *self;
1283 PyObject *args;
1284{
1285 PyObject *s;
Guido van Rossum43713e52000-02-29 13:59:29 +00001286 if (!PyArg_ParseTuple(args, "S:intern", &s))
Guido van Rossume8811f81997-02-14 15:48:05 +00001287 return NULL;
1288 Py_INCREF(s);
1289 PyString_InternInPlace(&s);
1290 return s;
1291}
1292
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001293static char intern_doc[] =
1294"intern(string) -> string\n\
1295\n\
1296``Intern'' the given string. This enters the string in the (global)\n\
1297table of interned strings whose purpose is to speed up dictionary lookups.\n\
1298Return the string itself or the previously interned string object with the\n\
1299same value.";
1300
1301
Guido van Rossum79f25d91997-04-29 20:08:16 +00001302static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001303builtin_int(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001304 PyObject *self;
1305 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001306{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001307 PyObject *v;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001308 int base = -909; /* unlikely! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001309
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001310 if (!PyArg_ParseTuple(args, "O|i:int", &v, &base))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001311 return NULL;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001312 if (base == -909)
1313 return PyNumber_Int(v);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001314 else if (PyString_Check(v))
1315 return PyInt_FromString(PyString_AS_STRING(v), NULL, base);
1316 else if (PyUnicode_Check(v))
1317 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(v),
1318 PyUnicode_GET_SIZE(v),
1319 base);
1320 else {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001321 PyErr_SetString(PyExc_TypeError,
1322 "can't convert non-string with explicit base");
1323 return NULL;
1324 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001325}
1326
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001327static char int_doc[] =
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001328"int(x[, base]) -> integer\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001329\n\
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001330Convert a string or number to an integer, if possible. A floating point\n\
1331argument will be truncated towards zero (this does not include a string\n\
1332representation of a floating point number!) When converting a string, use\n\
1333the optional base. It is an error to supply a base when converting a\n\
1334non-string.";
1335
1336
1337static PyObject *
1338builtin_long(self, args)
1339 PyObject *self;
1340 PyObject *args;
1341{
1342 PyObject *v;
1343 int base = -909; /* unlikely! */
1344
1345 if (!PyArg_ParseTuple(args, "O|i:long", &v, &base))
1346 return NULL;
1347 if (base == -909)
1348 return PyNumber_Long(v);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001349 else if (PyString_Check(v))
1350 return PyLong_FromString(PyString_AS_STRING(v), NULL, base);
1351 else if (PyUnicode_Check(v))
1352 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(v),
1353 PyUnicode_GET_SIZE(v),
1354 base);
1355 else {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001356 PyErr_SetString(PyExc_TypeError,
1357 "can't convert non-string with explicit base");
1358 return NULL;
1359 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001360}
1361
1362static char long_doc[] =
1363"long(x) -> long integer\n\
1364long(x, base) -> long integer\n\
1365\n\
1366Convert a string or number to a long integer, if possible. A floating\n\
1367point argument will be truncated towards zero (this does not include a\n\
1368string representation of a floating point number!) When converting a\n\
1369string, use the given base. It is an error to supply a base when\n\
1370converting a non-string.";
1371
1372
1373static PyObject *
1374builtin_float(self, args)
1375 PyObject *self;
1376 PyObject *args;
1377{
1378 PyObject *v;
1379
1380 if (!PyArg_ParseTuple(args, "O:float", &v))
1381 return NULL;
1382 if (PyString_Check(v))
1383 return PyFloat_FromString(v, NULL);
1384 return PyNumber_Float(v);
1385}
1386
1387static char float_doc[] =
1388"float(x) -> floating point number\n\
1389\n\
1390Convert a string or number to a floating point number, if possible.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001391
1392
Guido van Rossum79f25d91997-04-29 20:08:16 +00001393static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001394builtin_len(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001395 PyObject *self;
1396 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001397{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001398 PyObject *v;
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001399 long res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001400
Guido van Rossum79f25d91997-04-29 20:08:16 +00001401 if (!PyArg_ParseTuple(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001402 return NULL;
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001403 res = PyObject_Length(v);
1404 if (res < 0 && PyErr_Occurred())
1405 return NULL;
1406 return PyInt_FromLong(res);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001407}
1408
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001409static char len_doc[] =
1410"len(object) -> integer\n\
1411\n\
1412Return the number of items of a sequence or mapping.";
1413
1414
Guido van Rossum79f25d91997-04-29 20:08:16 +00001415static PyObject *
Guido van Rossumd1705771996-04-09 02:41:06 +00001416builtin_list(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001417 PyObject *self;
1418 PyObject *args;
Guido van Rossumd1705771996-04-09 02:41:06 +00001419{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001420 PyObject *v;
Guido van Rossumd1705771996-04-09 02:41:06 +00001421
Guido van Rossum79f25d91997-04-29 20:08:16 +00001422 if (!PyArg_ParseTuple(args, "O:list", &v))
Guido van Rossumd1705771996-04-09 02:41:06 +00001423 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001424 return PySequence_List(v);
Guido van Rossumd1705771996-04-09 02:41:06 +00001425}
1426
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001427static char list_doc[] =
1428"list(sequence) -> list\n\
1429\n\
1430Return a new list whose items are the same as those of the argument sequence.";
1431
Guido van Rossum8861b741996-07-30 16:49:37 +00001432
1433static PyObject *
1434builtin_slice(self, args)
1435 PyObject *self;
1436 PyObject *args;
1437{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001438 PyObject *start, *stop, *step;
Guido van Rossum8861b741996-07-30 16:49:37 +00001439
Guido van Rossum09df08a1998-05-22 00:51:39 +00001440 start = stop = step = NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001441
Guido van Rossum09df08a1998-05-22 00:51:39 +00001442 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
1443 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001444
Guido van Rossum09df08a1998-05-22 00:51:39 +00001445 /* This swapping of stop and start is to maintain similarity with
1446 range(). */
1447 if (stop == NULL) {
1448 stop = start;
1449 start = NULL;
1450 }
1451 return PySlice_New(start, stop, step);
Guido van Rossum8861b741996-07-30 16:49:37 +00001452}
1453
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001454static char slice_doc[] =
Fred Drake3d587441999-07-19 15:21:16 +00001455"slice([start,] stop[, step]) -> slice object\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001456\n\
1457Create a slice object. This is used for slicing by the Numeric extensions.";
1458
1459
Guido van Rossum79f25d91997-04-29 20:08:16 +00001460static PyObject *
Guido van Rossum872537c1995-07-07 22:43:42 +00001461builtin_locals(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001462 PyObject *self;
1463 PyObject *args;
Guido van Rossum872537c1995-07-07 22:43:42 +00001464{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001465 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +00001466
Guido van Rossum43713e52000-02-29 13:59:29 +00001467 if (!PyArg_ParseTuple(args, ":locals"))
Guido van Rossum872537c1995-07-07 22:43:42 +00001468 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001469 d = PyEval_GetLocals();
1470 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +00001471 return d;
1472}
1473
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001474static char locals_doc[] =
1475"locals() -> dictionary\n\
1476\n\
1477Return the dictionary containing the current scope's local variables.";
1478
1479
Guido van Rossum79f25d91997-04-29 20:08:16 +00001480static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001481min_max(args, sign)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001482 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001483 int sign;
1484{
Guido van Rossum2d951851994-08-29 12:52:16 +00001485 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001486 PyObject *v, *w, *x;
1487 PySequenceMethods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001488
Guido van Rossum79f25d91997-04-29 20:08:16 +00001489 if (PyTuple_Size(args) > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001490 v = args;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001491 else if (!PyArg_ParseTuple(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001492 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001493 sq = v->ob_type->tp_as_sequence;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001494 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001495 PyErr_SetString(PyExc_TypeError,
1496 "min() or max() of non-sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001497 return NULL;
1498 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001499 w = NULL;
1500 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001501 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +00001502 if (x == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001503 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001504 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001505 break;
1506 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001507 Py_XDECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001508 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001509 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001510 if (w == NULL)
1511 w = x;
1512 else {
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001513 int c = PyObject_Compare(x, w);
1514 if (c && PyErr_Occurred()) {
1515 Py_DECREF(x);
1516 Py_XDECREF(w);
1517 return NULL;
1518 }
1519 if (c * sign > 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001520 Py_DECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001521 w = x;
1522 }
1523 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001524 Py_DECREF(x);
Guido van Rossum2d951851994-08-29 12:52:16 +00001525 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001526 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001527 if (w == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001528 PyErr_SetString(PyExc_ValueError,
1529 "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001530 return w;
1531}
1532
Guido van Rossum79f25d91997-04-29 20:08:16 +00001533static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001534builtin_min(self, v)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001535 PyObject *self;
1536 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001537{
1538 return min_max(v, -1);
1539}
1540
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001541static char min_doc[] =
1542"min(sequence) -> value\n\
1543min(a, b, c, ...) -> value\n\
1544\n\
1545With a single sequence argument, return its smallest item.\n\
1546With two or more arguments, return the smallest argument.";
1547
1548
Guido van Rossum79f25d91997-04-29 20:08:16 +00001549static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001550builtin_max(self, v)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001551 PyObject *self;
1552 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001553{
1554 return min_max(v, 1);
1555}
1556
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001557static char max_doc[] =
1558"max(sequence) -> value\n\
1559max(a, b, c, ...) -> value\n\
1560\n\
1561With a single sequence argument, return its largest item.\n\
1562With two or more arguments, return the largest argument.";
1563
1564
Guido van Rossum79f25d91997-04-29 20:08:16 +00001565static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001566builtin_oct(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001567 PyObject *self;
1568 PyObject *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001569{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001570 PyObject *v;
1571 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001572
Guido van Rossum79f25d91997-04-29 20:08:16 +00001573 if (!PyArg_ParseTuple(args, "O:oct", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001574 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001575 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1576 nb->nb_oct == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001577 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001578 "oct() argument can't be converted to oct");
1579 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001580 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001581 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001582}
1583
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001584static char oct_doc[] =
1585"oct(number) -> string\n\
1586\n\
1587Return the octal representation of an integer or long integer.";
1588
1589
Guido van Rossum79f25d91997-04-29 20:08:16 +00001590static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +00001591builtin_open(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001592 PyObject *self;
1593 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001594{
Guido van Rossum2d951851994-08-29 12:52:16 +00001595 char *name;
1596 char *mode = "r";
1597 int bufsize = -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001598 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001599
Guido van Rossum79f25d91997-04-29 20:08:16 +00001600 if (!PyArg_ParseTuple(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001601 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001602 f = PyFile_FromString(name, mode);
Guido van Rossum2d951851994-08-29 12:52:16 +00001603 if (f != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001604 PyFile_SetBufSize(f, bufsize);
Guido van Rossum2d951851994-08-29 12:52:16 +00001605 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001606}
1607
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001608static char open_doc[] =
1609"open(filename[, mode[, buffering]]) -> file object\n\
1610\n\
1611Open a file. The mode can be 'r', 'w' or 'a' for reading (default),\n\
1612writing or appending. The file will be created if it doesn't exist\n\
1613when opened for writing or appending; it will be truncated when\n\
1614opened for writing. Add a 'b' to the mode for binary files.\n\
1615Add a '+' to the mode to allow simultaneous reading and writing.\n\
1616If the buffering argument is given, 0 means unbuffered, 1 means line\n\
1617buffered, and larger numbers specify the buffer size.";
1618
1619
Guido van Rossum79f25d91997-04-29 20:08:16 +00001620static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +00001621builtin_ord(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001622 PyObject *self;
1623 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001624{
Guido van Rossum09095f32000-03-10 23:00:52 +00001625 PyObject *obj;
1626 long ord;
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001627 int size;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001628
Guido van Rossum09095f32000-03-10 23:00:52 +00001629 if (!PyArg_ParseTuple(args, "O:ord", &obj))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001630 return NULL;
Guido van Rossum09095f32000-03-10 23:00:52 +00001631
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001632 if (PyString_Check(obj)) {
1633 size = PyString_GET_SIZE(obj);
1634 if (size == 1)
1635 ord = (long)((unsigned char)*PyString_AS_STRING(obj));
1636 } else if (PyUnicode_Check(obj)) {
1637 size = PyUnicode_GET_SIZE(obj);
1638 if (size == 1)
1639 ord = (long)*PyUnicode_AS_UNICODE(obj);
1640 } else {
1641 PyErr_Format(PyExc_TypeError,
Fred Drake078b24f2000-04-13 02:42:50 +00001642 "expected string or Unicode character, " \
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001643 "%.200s found", obj->ob_type->tp_name);
Guido van Rossum09095f32000-03-10 23:00:52 +00001644 return NULL;
1645 }
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001646 if (size == 1)
1647 return PyInt_FromLong(ord);
Guido van Rossum09095f32000-03-10 23:00:52 +00001648
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001649 PyErr_Format(PyExc_TypeError,
1650 "expected a character, length-%d string found",
1651 size);
1652 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001653}
1654
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001655static char ord_doc[] =
1656"ord(c) -> integer\n\
1657\n\
Fred Drake078b24f2000-04-13 02:42:50 +00001658Return the integer ordinal of a one character string.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001659
1660
Guido van Rossum79f25d91997-04-29 20:08:16 +00001661static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001662builtin_pow(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001663 PyObject *self;
1664 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001665{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001666 PyObject *v, *w, *z = Py_None;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001667
Guido van Rossum79f25d91997-04-29 20:08:16 +00001668 if (!PyArg_ParseTuple(args, "OO|O:pow", &v, &w, &z))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001669 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001670 return PyNumber_Power(v, w, z);
Guido van Rossumd4905451991-05-05 20:00:36 +00001671}
1672
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001673static char pow_doc[] =
1674"pow(x, y[, z]) -> number\n\
1675\n\
1676With two arguments, equivalent to x**y. With three arguments,\n\
1677equivalent to (x**y) % z, but may be more efficient (e.g. for longs).";
1678
1679
Guido van Rossum124eff01999-02-23 16:11:01 +00001680/* Return number of items in range/xrange (lo, hi, step). step > 0
1681 * required. Return a value < 0 if & only if the true value is too
1682 * large to fit in a signed long.
1683 */
1684static long
1685get_len_of_range(lo, hi, step)
1686 long lo;
1687 long hi;
1688 long step; /* must be > 0 */
1689{
1690 /* -------------------------------------------------------------
1691 If lo >= hi, the range is empty.
1692 Else if n values are in the range, the last one is
1693 lo + (n-1)*step, which must be <= hi-1. Rearranging,
1694 n <= (hi - lo - 1)/step + 1, so taking the floor of the RHS gives
1695 the proper value. Since lo < hi in this case, hi-lo-1 >= 0, so
1696 the RHS is non-negative and so truncation is the same as the
1697 floor. Letting M be the largest positive long, the worst case
1698 for the RHS numerator is hi=M, lo=-M-1, and then
1699 hi-lo-1 = M-(-M-1)-1 = 2*M. Therefore unsigned long has enough
1700 precision to compute the RHS exactly.
1701 ---------------------------------------------------------------*/
1702 long n = 0;
1703 if (lo < hi) {
1704 unsigned long uhi = (unsigned long)hi;
1705 unsigned long ulo = (unsigned long)lo;
1706 unsigned long diff = uhi - ulo - 1;
1707 n = (long)(diff / (unsigned long)step + 1);
1708 }
1709 return n;
1710}
1711
Guido van Rossum79f25d91997-04-29 20:08:16 +00001712static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001713builtin_range(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001714 PyObject *self;
1715 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001716{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001717 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum124eff01999-02-23 16:11:01 +00001718 long bign;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001719 int i, n;
Guido van Rossum124eff01999-02-23 16:11:01 +00001720
Guido van Rossum79f25d91997-04-29 20:08:16 +00001721 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001722
Guido van Rossum79f25d91997-04-29 20:08:16 +00001723 if (PyTuple_Size(args) <= 1) {
1724 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001725 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001726 &ihigh))
1727 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001728 }
1729 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001730 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001731 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001732 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001733 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001734 }
1735 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001736 PyErr_SetString(PyExc_ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001737 return NULL;
1738 }
Guido van Rossum124eff01999-02-23 16:11:01 +00001739 if (istep > 0)
1740 bign = get_len_of_range(ilow, ihigh, istep);
1741 else
1742 bign = get_len_of_range(ihigh, ilow, -istep);
1743 n = (int)bign;
1744 if (bign < 0 || (long)n != bign) {
Guido van Rossume23cde21999-01-12 05:07:47 +00001745 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum124eff01999-02-23 16:11:01 +00001746 "range() has too many items");
Guido van Rossume23cde21999-01-12 05:07:47 +00001747 return NULL;
1748 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001749 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001750 if (v == NULL)
1751 return NULL;
1752 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001753 PyObject *w = PyInt_FromLong(ilow);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001754 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001755 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001756 return NULL;
1757 }
Guido van Rossuma937d141998-04-24 18:22:02 +00001758 PyList_SET_ITEM(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001759 ilow += istep;
1760 }
1761 return v;
1762}
1763
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001764static char range_doc[] =
1765"range([start,] stop[, step]) -> list of integers\n\
1766\n\
1767Return a list containing an arithmetic progression of integers.\n\
1768range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.\n\
1769When step is given, it specifies the increment (or decrement).\n\
1770For example, range(4) returns [0, 1, 2, 3]. The end point is omitted!\n\
1771These are exactly the valid indices for a list of 4 elements.";
1772
1773
Guido van Rossum79f25d91997-04-29 20:08:16 +00001774static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001775builtin_xrange(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001776 PyObject *self;
1777 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001778{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001779 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001780 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001781
Guido van Rossum79f25d91997-04-29 20:08:16 +00001782 if (PyTuple_Size(args) <= 1) {
1783 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001784 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001785 &ihigh))
1786 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001787 }
1788 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001789 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001790 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001791 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001792 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001793 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001794 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001795 PyErr_SetString(PyExc_ValueError, "zero step for xrange()");
Guido van Rossum12d12c51993-10-26 17:58:25 +00001796 return NULL;
1797 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001798 if (istep > 0)
Guido van Rossum124eff01999-02-23 16:11:01 +00001799 n = get_len_of_range(ilow, ihigh, istep);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001800 else
Guido van Rossum124eff01999-02-23 16:11:01 +00001801 n = get_len_of_range(ihigh, ilow, -istep);
1802 if (n < 0) {
1803 PyErr_SetString(PyExc_OverflowError,
1804 "xrange() has more than sys.maxint items");
1805 return NULL;
1806 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001807 return PyRange_New(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001808}
1809
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001810static char xrange_doc[] =
1811"xrange([start,] stop[, step]) -> xrange object\n\
1812\n\
1813Like range(), but instead of returning a list, returns an object that\n\
1814generates the numbers in the range on demand. This is slightly slower\n\
1815than range() but more memory efficient.";
1816
1817
Guido van Rossum79f25d91997-04-29 20:08:16 +00001818static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001819builtin_raw_input(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001820 PyObject *self;
1821 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001822{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001823 PyObject *v = NULL;
1824 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001825
Guido van Rossum79f25d91997-04-29 20:08:16 +00001826 if (!PyArg_ParseTuple(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001827 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001828 if (PyFile_AsFile(PySys_GetObject("stdin")) == stdin &&
1829 PyFile_AsFile(PySys_GetObject("stdout")) == stdout &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001830 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001831 PyObject *po;
Guido van Rossum872537c1995-07-07 22:43:42 +00001832 char *prompt;
1833 char *s;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001834 PyObject *result;
Guido van Rossum872537c1995-07-07 22:43:42 +00001835 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001836 po = PyObject_Str(v);
Guido van Rossum872537c1995-07-07 22:43:42 +00001837 if (po == NULL)
1838 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001839 prompt = PyString_AsString(po);
Guido van Rossumd9b52081998-06-26 18:25:38 +00001840 if (prompt == NULL)
1841 return NULL;
Guido van Rossum872537c1995-07-07 22:43:42 +00001842 }
1843 else {
1844 po = NULL;
1845 prompt = "";
1846 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001847 s = PyOS_Readline(prompt);
1848 Py_XDECREF(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001849 if (s == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001850 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossum872537c1995-07-07 22:43:42 +00001851 return NULL;
1852 }
1853 if (*s == '\0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001854 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum872537c1995-07-07 22:43:42 +00001855 result = NULL;
1856 }
1857 else { /* strip trailing '\n' */
Guido van Rossum106f2da2000-06-28 21:12:25 +00001858 size_t len = strlen(s);
1859 if (len > INT_MAX) {
1860 PyErr_SetString(PyExc_OverflowError, "input too long");
1861 result = NULL;
1862 }
1863 else {
1864 result = PyString_FromStringAndSize(s, (int)(len-1));
1865 }
Guido van Rossum872537c1995-07-07 22:43:42 +00001866 }
Guido van Rossumb18618d2000-05-03 23:44:39 +00001867 PyMem_FREE(s);
Guido van Rossum872537c1995-07-07 22:43:42 +00001868 return result;
1869 }
Guido van Rossum90933611991-06-07 16:10:43 +00001870 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001871 f = PySys_GetObject("stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001872 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001873 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001874 return NULL;
1875 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001876 if (Py_FlushLine() != 0 ||
1877 PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001878 return NULL;
1879 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001880 f = PySys_GetObject("stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001881 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001882 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001883 return NULL;
1884 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001885 return PyFile_GetLine(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001886}
1887
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001888static char raw_input_doc[] =
1889"raw_input([prompt]) -> string\n\
1890\n\
1891Read a string from standard input. The trailing newline is stripped.\n\
1892If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.\n\
1893On Unix, GNU readline is used if enabled. The prompt string, if given,\n\
1894is printed without a trailing newline before reading.";
1895
1896
Guido van Rossum79f25d91997-04-29 20:08:16 +00001897static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001898builtin_reduce(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001899 PyObject *self;
1900 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001901{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001902 PyObject *seq, *func, *result = NULL;
1903 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001904 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001905
Guido van Rossum79f25d91997-04-29 20:08:16 +00001906 if (!PyArg_ParseTuple(args, "OO|O:reduce", &func, &seq, &result))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001907 return NULL;
1908 if (result != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001909 Py_INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001910
Guido van Rossum09df08a1998-05-22 00:51:39 +00001911 sqf = seq->ob_type->tp_as_sequence;
1912 if (sqf == NULL || sqf->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001913 PyErr_SetString(PyExc_TypeError,
Guido van Rossum12d12c51993-10-26 17:58:25 +00001914 "2nd argument to reduce() must be a sequence object");
1915 return NULL;
1916 }
1917
Guido van Rossum79f25d91997-04-29 20:08:16 +00001918 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001919 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001920
Guido van Rossum2d951851994-08-29 12:52:16 +00001921 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001922 PyObject *op2;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001923
1924 if (args->ob_refcnt > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001925 Py_DECREF(args);
1926 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001927 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001928 }
1929
Guido van Rossum2d951851994-08-29 12:52:16 +00001930 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001931 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001932 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001933 break;
1934 }
1935 goto Fail;
1936 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001937
Guido van Rossum2d951851994-08-29 12:52:16 +00001938 if (result == NULL)
1939 result = op2;
1940 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001941 PyTuple_SetItem(args, 0, result);
1942 PyTuple_SetItem(args, 1, op2);
1943 if ((result = PyEval_CallObject(func, args)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001944 goto Fail;
1945 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001946 }
1947
Guido van Rossum79f25d91997-04-29 20:08:16 +00001948 Py_DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001949
Guido van Rossum2d951851994-08-29 12:52:16 +00001950 if (result == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001951 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001952 "reduce of empty sequence with no initial value");
1953
Guido van Rossum12d12c51993-10-26 17:58:25 +00001954 return result;
1955
Guido van Rossum2d951851994-08-29 12:52:16 +00001956Fail:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001957 Py_XDECREF(args);
1958 Py_XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001959 return NULL;
1960}
1961
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001962static char reduce_doc[] =
1963"reduce(function, sequence[, initial]) -> value\n\
1964\n\
1965Apply a function of two arguments cumulatively to the items of a sequence,\n\
1966from left to right, so as to reduce the sequence to a single value.\n\
1967For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\
1968((((1+2)+3)+4)+5). If initial is present, it is placed before the items\n\
1969of the sequence in the calculation, and serves as a default when the\n\
1970sequence is empty.";
1971
1972
Guido van Rossum79f25d91997-04-29 20:08:16 +00001973static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001974builtin_reload(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001975 PyObject *self;
1976 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001977{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001978 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001979
Guido van Rossum79f25d91997-04-29 20:08:16 +00001980 if (!PyArg_ParseTuple(args, "O:reload", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001981 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001982 return PyImport_ReloadModule(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001983}
1984
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001985static char reload_doc[] =
1986"reload(module) -> module\n\
1987\n\
1988Reload the module. The module must have been successfully imported before.";
1989
1990
Guido van Rossum79f25d91997-04-29 20:08:16 +00001991static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001992builtin_repr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001993 PyObject *self;
1994 PyObject *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001995{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001996 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001997
Guido van Rossum79f25d91997-04-29 20:08:16 +00001998 if (!PyArg_ParseTuple(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001999 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002000 return PyObject_Repr(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002001}
2002
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002003static char repr_doc[] =
2004"repr(object) -> string\n\
2005\n\
2006Return the canonical string representation of the object.\n\
2007For most object types, eval(repr(object)) == object.";
2008
2009
Guido van Rossum79f25d91997-04-29 20:08:16 +00002010static PyObject *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00002011builtin_round(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002012 PyObject *self;
2013 PyObject *args;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00002014{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00002015 double x;
2016 double f;
2017 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00002018 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002019
Guido van Rossum79f25d91997-04-29 20:08:16 +00002020 if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00002021 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00002022 f = 1.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00002023 i = abs(ndigits);
2024 while (--i >= 0)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00002025 f = f*10.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00002026 if (ndigits < 0)
2027 x /= f;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00002028 else
Guido van Rossum1e162d31998-05-09 14:42:25 +00002029 x *= f;
2030 if (x >= 0.0)
2031 x = floor(x + 0.5);
2032 else
2033 x = ceil(x - 0.5);
2034 if (ndigits < 0)
2035 x *= f;
2036 else
2037 x /= f;
2038 return PyFloat_FromDouble(x);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00002039}
2040
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002041static char round_doc[] =
2042"round(number[, ndigits]) -> floating point number\n\
2043\n\
2044Round a number to a given precision in decimal digits (default 0 digits).\n\
2045This always returns a floating point number. Precision may be negative.";
2046
2047
Guido van Rossum79f25d91997-04-29 20:08:16 +00002048static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002049builtin_str(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002050 PyObject *self;
2051 PyObject *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00002052{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002053 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002054
Guido van Rossum79f25d91997-04-29 20:08:16 +00002055 if (!PyArg_ParseTuple(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00002056 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002057 return PyObject_Str(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002058}
2059
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002060static char str_doc[] =
2061"str(object) -> string\n\
2062\n\
2063Return a nice string representation of the object.\n\
2064If the argument is a string, the return value is the same object.";
2065
2066
Guido van Rossum79f25d91997-04-29 20:08:16 +00002067static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002068builtin_tuple(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002069 PyObject *self;
2070 PyObject *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00002071{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002072 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002073
Guido van Rossum79f25d91997-04-29 20:08:16 +00002074 if (!PyArg_ParseTuple(args, "O:tuple", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002075 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00002076 return PySequence_Tuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00002077}
2078
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002079static char tuple_doc[] =
2080"tuple(sequence) -> list\n\
2081\n\
2082Return a tuple whose items are the same as those of the argument sequence.\n\
2083If the argument is a tuple, the return value is the same object.";
2084
2085
Guido van Rossum79f25d91997-04-29 20:08:16 +00002086static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002087builtin_type(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002088 PyObject *self;
2089 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002090{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002091 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002092
Guido van Rossum79f25d91997-04-29 20:08:16 +00002093 if (!PyArg_ParseTuple(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002094 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002095 v = (PyObject *)v->ob_type;
2096 Py_INCREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002097 return v;
2098}
2099
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002100static char type_doc[] =
2101"type(object) -> type object\n\
2102\n\
2103Return the type of the object.";
2104
2105
Guido van Rossum79f25d91997-04-29 20:08:16 +00002106static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002107builtin_vars(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002108 PyObject *self;
2109 PyObject *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00002110{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002111 PyObject *v = NULL;
2112 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002113
Guido van Rossum79f25d91997-04-29 20:08:16 +00002114 if (!PyArg_ParseTuple(args, "|O:vars", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002115 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00002116 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002117 d = PyEval_GetLocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00002118 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002119 if (!PyErr_Occurred())
2120 PyErr_SetString(PyExc_SystemError,
2121 "no locals!?");
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00002122 }
2123 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002124 Py_INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00002125 }
2126 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002127 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum2d951851994-08-29 12:52:16 +00002128 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002129 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00002130 "vars() argument must have __dict__ attribute");
2131 return NULL;
2132 }
2133 }
2134 return d;
2135}
2136
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002137static char vars_doc[] =
2138"vars([object]) -> dictionary\n\
2139\n\
2140Without arguments, equivalent to locals().\n\
2141With an argument, equivalent to object.__dict__.";
2142
Guido van Rossum668213d1999-06-16 17:28:37 +00002143static int
2144abstract_issubclass(derived, cls, err, first)
2145 PyObject *derived;
2146 PyObject *cls;
2147 char *err;
2148 int first;
2149{
2150 static PyObject *__bases__ = NULL;
2151 PyObject *bases;
Guido van Rossum7f851861999-06-17 19:12:39 +00002152 int i, n;
Guido van Rossum668213d1999-06-16 17:28:37 +00002153 int r = 0;
2154
2155 if (__bases__ == NULL) {
2156 __bases__ = PyString_FromString("__bases__");
2157 if (__bases__ == NULL)
2158 return -1;
2159 }
2160
2161 if (first) {
2162 bases = PyObject_GetAttr(cls, __bases__);
2163 if (bases == NULL || !PyTuple_Check(bases)) {
2164 Py_XDECREF(bases);
2165 PyErr_SetString(PyExc_TypeError, err);
2166 return -1;
2167 }
2168 Py_DECREF(bases);
2169 }
2170
2171 if (derived == cls)
2172 return 1;
2173
2174 bases = PyObject_GetAttr(derived, __bases__);
2175 if (bases == NULL || !PyTuple_Check(bases)) {
2176 Py_XDECREF(bases);
2177 PyErr_SetString(PyExc_TypeError, err);
2178 return -1;
2179 }
2180
2181 n = PyTuple_GET_SIZE(bases);
2182 for (i = 0; i < n; i++) {
2183 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i),
2184 cls, err, 0);
2185 if (r != 0)
2186 break;
2187 }
2188
2189 Py_DECREF(bases);
2190
2191 return r;
2192}
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002193
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002194static PyObject *
2195builtin_isinstance(self, args)
2196 PyObject *self;
2197 PyObject *args;
2198{
2199 PyObject *inst;
2200 PyObject *cls;
Guido van Rossum668213d1999-06-16 17:28:37 +00002201 PyObject *icls;
2202 static PyObject *__class__ = NULL;
2203 int retval = 0;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002204
Guido van Rossum43713e52000-02-29 13:59:29 +00002205 if (!PyArg_ParseTuple(args, "OO:isinstance", &inst, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002206 return NULL;
Guido van Rossumf5dd9141997-12-02 19:11:45 +00002207
Guido van Rossum668213d1999-06-16 17:28:37 +00002208 if (PyClass_Check(cls)) {
2209 if (PyInstance_Check(inst)) {
Guido van Rossumf5dd9141997-12-02 19:11:45 +00002210 PyObject *inclass =
2211 (PyObject*)((PyInstanceObject*)inst)->in_class;
2212 retval = PyClass_IsSubclass(inclass, cls);
2213 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002214 }
Guido van Rossum668213d1999-06-16 17:28:37 +00002215 else if (PyType_Check(cls)) {
2216 retval = ((PyObject *)(inst->ob_type) == cls);
2217 }
2218 else if (!PyInstance_Check(inst)) {
2219 if (__class__ == NULL) {
2220 __class__ = PyString_FromString("__class__");
2221 if (__class__ == NULL)
2222 return NULL;
2223 }
2224 icls = PyObject_GetAttr(inst, __class__);
2225 if (icls != NULL) {
2226 retval = abstract_issubclass(
2227 icls, cls,
2228 "second argument must be a class",
2229 1);
2230 Py_DECREF(icls);
2231 if (retval < 0)
2232 return NULL;
2233 }
2234 else {
2235 PyErr_SetString(PyExc_TypeError,
2236 "second argument must be a class");
2237 return NULL;
2238 }
2239 }
2240 else {
2241 PyErr_SetString(PyExc_TypeError,
2242 "second argument must be a class");
2243 return NULL;
2244 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002245 return PyInt_FromLong(retval);
2246}
2247
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002248static char isinstance_doc[] =
2249"isinstance(object, class-or-type) -> Boolean\n\
2250\n\
2251Return whether an object is an instance of a class or of a subclass thereof.\n\
2252With a type as second argument, return whether that is the object's type.";
2253
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002254
2255static PyObject *
2256builtin_issubclass(self, args)
2257 PyObject *self;
2258 PyObject *args;
2259{
2260 PyObject *derived;
2261 PyObject *cls;
2262 int retval;
2263
Guido van Rossum43713e52000-02-29 13:59:29 +00002264 if (!PyArg_ParseTuple(args, "OO:issubclass", &derived, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002265 return NULL;
Guido van Rossum668213d1999-06-16 17:28:37 +00002266
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002267 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossum668213d1999-06-16 17:28:37 +00002268 retval = abstract_issubclass(
2269 derived, cls, "arguments must be classes", 1);
2270 if (retval < 0)
2271 return NULL;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002272 }
Guido van Rossum668213d1999-06-16 17:28:37 +00002273 else {
2274 /* shortcut */
2275 if (!(retval = (derived == cls)))
2276 retval = PyClass_IsSubclass(derived, cls);
2277 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002278
2279 return PyInt_FromLong(retval);
2280}
2281
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002282static char issubclass_doc[] =
2283"issubclass(C, B) -> Boolean\n\
2284\n\
2285Return whether class C is a subclass (i.e., a derived class) of class B.";
2286
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002287
Guido van Rossum79f25d91997-04-29 20:08:16 +00002288static PyMethodDef builtin_methods[] = {
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002289 {"__import__", builtin___import__, 1, import_doc},
2290 {"abs", builtin_abs, 1, abs_doc},
2291 {"apply", builtin_apply, 1, apply_doc},
Guido van Rossum0daf0221999-03-19 19:07:19 +00002292 {"buffer", builtin_buffer, 1, buffer_doc},
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002293 {"callable", builtin_callable, 1, callable_doc},
2294 {"chr", builtin_chr, 1, chr_doc},
2295 {"cmp", builtin_cmp, 1, cmp_doc},
2296 {"coerce", builtin_coerce, 1, coerce_doc},
2297 {"compile", builtin_compile, 1, compile_doc},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00002298#ifndef WITHOUT_COMPLEX
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002299 {"complex", builtin_complex, 1, complex_doc},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00002300#endif
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002301 {"delattr", builtin_delattr, 1, delattr_doc},
2302 {"dir", builtin_dir, 1, dir_doc},
2303 {"divmod", builtin_divmod, 1, divmod_doc},
2304 {"eval", builtin_eval, 1, eval_doc},
2305 {"execfile", builtin_execfile, 1, execfile_doc},
2306 {"filter", builtin_filter, 1, filter_doc},
2307 {"float", builtin_float, 1, float_doc},
2308 {"getattr", builtin_getattr, 1, getattr_doc},
2309 {"globals", builtin_globals, 1, globals_doc},
2310 {"hasattr", builtin_hasattr, 1, hasattr_doc},
2311 {"hash", builtin_hash, 1, hash_doc},
2312 {"hex", builtin_hex, 1, hex_doc},
2313 {"id", builtin_id, 1, id_doc},
2314 {"input", builtin_input, 1, input_doc},
2315 {"intern", builtin_intern, 1, intern_doc},
2316 {"int", builtin_int, 1, int_doc},
2317 {"isinstance", builtin_isinstance, 1, isinstance_doc},
2318 {"issubclass", builtin_issubclass, 1, issubclass_doc},
2319 {"len", builtin_len, 1, len_doc},
2320 {"list", builtin_list, 1, list_doc},
2321 {"locals", builtin_locals, 1, locals_doc},
2322 {"long", builtin_long, 1, long_doc},
2323 {"map", builtin_map, 1, map_doc},
2324 {"max", builtin_max, 1, max_doc},
2325 {"min", builtin_min, 1, min_doc},
2326 {"oct", builtin_oct, 1, oct_doc},
2327 {"open", builtin_open, 1, open_doc},
2328 {"ord", builtin_ord, 1, ord_doc},
2329 {"pow", builtin_pow, 1, pow_doc},
2330 {"range", builtin_range, 1, range_doc},
2331 {"raw_input", builtin_raw_input, 1, raw_input_doc},
2332 {"reduce", builtin_reduce, 1, reduce_doc},
2333 {"reload", builtin_reload, 1, reload_doc},
2334 {"repr", builtin_repr, 1, repr_doc},
2335 {"round", builtin_round, 1, round_doc},
2336 {"setattr", builtin_setattr, 1, setattr_doc},
2337 {"slice", builtin_slice, 1, slice_doc},
2338 {"str", builtin_str, 1, str_doc},
2339 {"tuple", builtin_tuple, 1, tuple_doc},
2340 {"type", builtin_type, 1, type_doc},
Guido van Rossum09095f32000-03-10 23:00:52 +00002341 {"unicode", builtin_unicode, 1, unicode_doc},
2342 {"unichr", builtin_unichr, 1, unichr_doc},
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002343 {"vars", builtin_vars, 1, vars_doc},
2344 {"xrange", builtin_xrange, 1, xrange_doc},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00002345 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00002346};
2347
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002348static char builtin_doc[] =
2349"Built-in functions, exceptions, and other objects.\n\
2350\n\
2351Noteworthy: None is the `nil' object; Ellipsis represents `...' in slices.";
2352
Guido van Rossum25ce5661997-08-02 03:10:38 +00002353PyObject *
Barry Warsaw78e6c672000-05-25 23:15:05 +00002354_PyBuiltin_Init()
Guido van Rossum25ce5661997-08-02 03:10:38 +00002355{
Fred Drake5550de32000-06-20 04:54:19 +00002356 PyObject *mod, *dict, *debug;
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002357 mod = Py_InitModule4("__builtin__", builtin_methods,
2358 builtin_doc, (PyObject *)NULL,
2359 PYTHON_API_VERSION);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002360 if (mod == NULL)
2361 return NULL;
2362 dict = PyModule_GetDict(mod);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002363 if (PyDict_SetItemString(dict, "None", Py_None) < 0)
2364 return NULL;
2365 if (PyDict_SetItemString(dict, "Ellipsis", Py_Ellipsis) < 0)
2366 return NULL;
Fred Drake5550de32000-06-20 04:54:19 +00002367 debug = PyInt_FromLong(Py_OptimizeFlag == 0);
2368 if (PyDict_SetItemString(dict, "__debug__", debug) < 0) {
2369 Py_XDECREF(debug);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002370 return NULL;
Fred Drake5550de32000-06-20 04:54:19 +00002371 }
2372 Py_XDECREF(debug);
Barry Warsaw757af0e1997-08-29 22:13:51 +00002373
Guido van Rossum25ce5661997-08-02 03:10:38 +00002374 return mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002375}
2376
Guido van Rossume77a7571993-11-03 15:01:26 +00002377/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00002378
Guido van Rossum79f25d91997-04-29 20:08:16 +00002379static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00002380filtertuple(func, tuple)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002381 PyObject *func;
2382 PyObject *tuple;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002383{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002384 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002385 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002386 int len = PyTuple_Size(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002387
Guido van Rossumb7b45621995-08-04 04:07:45 +00002388 if (len == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002389 Py_INCREF(tuple);
Guido van Rossumb7b45621995-08-04 04:07:45 +00002390 return tuple;
2391 }
2392
Guido van Rossum79f25d91997-04-29 20:08:16 +00002393 if ((result = PyTuple_New(len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00002394 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002395
Guido van Rossum12d12c51993-10-26 17:58:25 +00002396 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002397 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002398 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002399
Guido van Rossum79f25d91997-04-29 20:08:16 +00002400 if ((item = PyTuple_GetItem(tuple, i)) == NULL)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002401 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002402 if (func == Py_None) {
2403 Py_INCREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002404 good = item;
2405 }
2406 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002407 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002408 if (arg == NULL)
2409 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002410 good = PyEval_CallObject(func, arg);
2411 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002412 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002413 goto Fail_1;
2414 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002415 ok = PyObject_IsTrue(good);
2416 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002417 if (ok) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002418 Py_INCREF(item);
2419 if (PyTuple_SetItem(result, j++, item) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002420 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002421 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00002422 }
2423
Guido van Rossum79f25d91997-04-29 20:08:16 +00002424 if (_PyTuple_Resize(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002425 return NULL;
2426
Guido van Rossum12d12c51993-10-26 17:58:25 +00002427 return result;
2428
Guido van Rossum12d12c51993-10-26 17:58:25 +00002429Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002430 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002431 return NULL;
2432}
2433
2434
Guido van Rossume77a7571993-11-03 15:01:26 +00002435/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00002436
Guido van Rossum79f25d91997-04-29 20:08:16 +00002437static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00002438filterstring(func, strobj)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002439 PyObject *func;
2440 PyObject *strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002441{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002442 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002443 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002444 int len = PyString_Size(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002445
Guido van Rossum79f25d91997-04-29 20:08:16 +00002446 if (func == Py_None) {
Guido van Rossum2586bf01993-11-01 16:21:44 +00002447 /* No character is ever false -- share input string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002448 Py_INCREF(strobj);
Guido van Rossum2d951851994-08-29 12:52:16 +00002449 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002450 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002451 if ((result = PyString_FromStringAndSize(NULL, len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00002452 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002453
Guido van Rossum12d12c51993-10-26 17:58:25 +00002454 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002455 PyObject *item, *arg, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002456 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002457
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002458 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
2459 if (item == NULL)
2460 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002461 arg = Py_BuildValue("(O)", item);
2462 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002463 if (arg == NULL)
2464 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002465 good = PyEval_CallObject(func, arg);
2466 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002467 if (good == NULL)
2468 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002469 ok = PyObject_IsTrue(good);
2470 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002471 if (ok)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002472 PyString_AS_STRING((PyStringObject *)result)[j++] =
2473 PyString_AS_STRING((PyStringObject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00002474 }
2475
Guido van Rossum79f25d91997-04-29 20:08:16 +00002476 if (j < len && _PyString_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002477 return NULL;
2478
Guido van Rossum12d12c51993-10-26 17:58:25 +00002479 return result;
2480
Guido van Rossum12d12c51993-10-26 17:58:25 +00002481Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002482 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002483 return NULL;
2484}