blob: 8e2720b93c2557a2df831caee31c9c04fa13a811 [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;
Marc-André Lemburg1b1bcc92000-07-07 13:48:25 +0000158 return PyUnicode_FromEncodedObject(v, encoding, errors);
Guido van Rossum09095f32000-03-10 23:00:52 +0000159}
160
161static char unicode_doc[] =
162"unicode(string [, encoding[, errors]]) -> object\n\
163\n\
Fred Drake078b24f2000-04-13 02:42:50 +0000164Creates a new Unicode object from the given encoded string.\n\
Fred Drakec640b182000-05-09 19:55:16 +0000165encoding defaults to the current default string encoding and \n\
166errors, defining the error handling, to 'strict'.";
Guido van Rossum09095f32000-03-10 23:00:52 +0000167
168
169static PyObject *
Guido van Rossum2d951851994-08-29 12:52:16 +0000170builtin_callable(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000171 PyObject *self;
172 PyObject *args;
Guido van Rossum2d951851994-08-29 12:52:16 +0000173{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000174 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000175
Guido van Rossum79f25d91997-04-29 20:08:16 +0000176 if (!PyArg_ParseTuple(args, "O:callable", &v))
Guido van Rossum2d951851994-08-29 12:52:16 +0000177 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000178 return PyInt_FromLong((long)PyCallable_Check(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000179}
180
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000181static char callable_doc[] =
182"callable(object) -> Boolean\n\
183\n\
184Return whether the object is callable (i.e., some kind of function).\n\
185Note that classes are callable, as are instances with a __call__() method.";
186
187
Guido van Rossum79f25d91997-04-29 20:08:16 +0000188static PyObject *
Guido van Rossume77a7571993-11-03 15:01:26 +0000189builtin_filter(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000190 PyObject *self;
191 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000192{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000193 PyObject *func, *seq, *result;
194 PySequenceMethods *sqf;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000195 int len;
196 register int i, j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000197
Guido van Rossum79f25d91997-04-29 20:08:16 +0000198 if (!PyArg_ParseTuple(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000199 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000200
Guido van Rossum79f25d91997-04-29 20:08:16 +0000201 if (PyString_Check(seq)) {
202 PyObject *r = filterstring(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000203 return r;
204 }
205
Guido van Rossum79f25d91997-04-29 20:08:16 +0000206 if (PyTuple_Check(seq)) {
207 PyObject *r = filtertuple(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000208 return r;
209 }
210
Guido van Rossum09df08a1998-05-22 00:51:39 +0000211 sqf = seq->ob_type->tp_as_sequence;
212 if (sqf == NULL || sqf->sq_length == NULL || sqf->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000213 PyErr_SetString(PyExc_TypeError,
Guido van Rossume77a7571993-11-03 15:01:26 +0000214 "argument 2 to filter() must be a sequence type");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000215 goto Fail_2;
216 }
217
218 if ((len = (*sqf->sq_length)(seq)) < 0)
219 goto Fail_2;
220
Guido van Rossum79f25d91997-04-29 20:08:16 +0000221 if (PyList_Check(seq) && seq->ob_refcnt == 1) {
222 Py_INCREF(seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000223 result = seq;
224 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000225 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 if ((result = PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000227 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000228 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000229
Guido van Rossum2d951851994-08-29 12:52:16 +0000230 for (i = j = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000231 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000232 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000233
Guido van Rossum2d951851994-08-29 12:52:16 +0000234 if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +0000235 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000236 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +0000237 break;
238 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000239 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000240 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000241
Guido van Rossum79f25d91997-04-29 20:08:16 +0000242 if (func == Py_None) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000243 good = item;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 Py_INCREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000245 }
246 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000247 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000248 if (arg == NULL)
249 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000250 good = PyEval_CallObject(func, arg);
251 Py_DECREF(arg);
Guido van Rossum58b68731995-01-10 17:40:55 +0000252 if (good == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000253 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000254 goto Fail_1;
Guido van Rossum58b68731995-01-10 17:40:55 +0000255 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000256 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000257 ok = PyObject_IsTrue(good);
258 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000259 if (ok) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000260 if (j < len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000261 if (PyList_SetItem(result, j++, item) < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000262 goto Fail_1;
263 }
264 else {
Barry Warsawfa77e091999-01-28 18:49:12 +0000265 int status = PyList_Append(result, item);
Guido van Rossum2d951851994-08-29 12:52:16 +0000266 j++;
Barry Warsawfa77e091999-01-28 18:49:12 +0000267 Py_DECREF(item);
268 if (status < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000269 goto Fail_1;
270 }
Guido van Rossum58b68731995-01-10 17:40:55 +0000271 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000272 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000273 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000274 }
275
Guido van Rossum12d12c51993-10-26 17:58:25 +0000276
Guido van Rossum79f25d91997-04-29 20:08:16 +0000277 if (j < len && PyList_SetSlice(result, j, len, NULL) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000278 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000279
Guido van Rossum12d12c51993-10-26 17:58:25 +0000280 return result;
281
Guido van Rossum12d12c51993-10-26 17:58:25 +0000282Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000283 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000284Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000285 return NULL;
286}
287
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000288static char filter_doc[] =
289"filter(function, sequence) -> list\n\
290\n\
291Return a list containing those items of sequence for which function(item)\n\
292is true. If function is None, return a list of items that are true.";
293
294
Guido van Rossum79f25d91997-04-29 20:08:16 +0000295static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +0000296builtin_chr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000297 PyObject *self;
298 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000299{
300 long x;
301 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000302
Guido van Rossum79f25d91997-04-29 20:08:16 +0000303 if (!PyArg_ParseTuple(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000304 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000305 if (x < 0 || x >= 256) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000306 PyErr_SetString(PyExc_ValueError,
307 "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000308 return NULL;
309 }
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000310 s[0] = (char)x;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000311 return PyString_FromStringAndSize(s, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000312}
313
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000314static char chr_doc[] =
315"chr(i) -> character\n\
316\n\
317Return a string of one character with ordinal i; 0 <= i < 256.";
318
319
Guido van Rossum79f25d91997-04-29 20:08:16 +0000320static PyObject *
Guido van Rossum09095f32000-03-10 23:00:52 +0000321builtin_unichr(self, args)
322 PyObject *self;
323 PyObject *args;
324{
325 long x;
326 Py_UNICODE s[1];
327
328 if (!PyArg_ParseTuple(args, "l:unichr", &x))
329 return NULL;
330 if (x < 0 || x >= 65536) {
331 PyErr_SetString(PyExc_ValueError,
332 "unichr() arg not in range(65536)");
333 return NULL;
334 }
335 s[0] = (Py_UNICODE)x;
336 return PyUnicode_FromUnicode(s, 1);
337}
338
339static char unichr_doc[] =
Fred Drake078b24f2000-04-13 02:42:50 +0000340"unichr(i) -> Unicode character\n\
Guido van Rossum09095f32000-03-10 23:00:52 +0000341\n\
Fred Drake078b24f2000-04-13 02:42:50 +0000342Return a Unicode string of one character with ordinal i; 0 <= i < 65536.";
Guido van Rossum09095f32000-03-10 23:00:52 +0000343
344
345static PyObject *
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000346builtin_cmp(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000347 PyObject *self;
348 PyObject *args;
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000349{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000350 PyObject *a, *b;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000351 int c;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000352
Guido van Rossum79f25d91997-04-29 20:08:16 +0000353 if (!PyArg_ParseTuple(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000354 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000355 if (PyObject_Cmp(a, b, &c) < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000356 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000357 return PyInt_FromLong((long)c);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000358}
359
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000360static char cmp_doc[] =
361"cmp(x, y) -> integer\n\
362\n\
363Return negative if x<y, zero if x==y, positive if x>y.";
364
365
Guido van Rossum79f25d91997-04-29 20:08:16 +0000366static PyObject *
Guido van Rossum5524a591995-01-10 15:26:20 +0000367builtin_coerce(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000368 PyObject *self;
369 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000370{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000371 PyObject *v, *w;
372 PyObject *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000373
Guido van Rossum79f25d91997-04-29 20:08:16 +0000374 if (!PyArg_ParseTuple(args, "OO:coerce", &v, &w))
Guido van Rossum5524a591995-01-10 15:26:20 +0000375 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000376 if (PyNumber_Coerce(&v, &w) < 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000377 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000378 res = Py_BuildValue("(OO)", v, w);
379 Py_DECREF(v);
380 Py_DECREF(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000381 return res;
382}
383
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000384static char coerce_doc[] =
385"coerce(x, y) -> None or (x1, y1)\n\
386\n\
387When x and y can be coerced to values of the same type, return a tuple\n\
388containing the coerced values. When they can't be coerced, return None.";
389
390
Guido van Rossum79f25d91997-04-29 20:08:16 +0000391static PyObject *
Guido van Rossum5b722181993-03-30 17:46:03 +0000392builtin_compile(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000393 PyObject *self;
394 PyObject *args;
Guido van Rossum5b722181993-03-30 17:46:03 +0000395{
396 char *str;
397 char *filename;
398 char *startstr;
399 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000400
Guido van Rossum79f25d91997-04-29 20:08:16 +0000401 if (!PyArg_ParseTuple(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000402 return NULL;
403 if (strcmp(startstr, "exec") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000404 start = Py_file_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000405 else if (strcmp(startstr, "eval") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000406 start = Py_eval_input;
Guido van Rossum872537c1995-07-07 22:43:42 +0000407 else if (strcmp(startstr, "single") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000408 start = Py_single_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000409 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000410 PyErr_SetString(PyExc_ValueError,
Guido van Rossum872537c1995-07-07 22:43:42 +0000411 "compile() mode must be 'exec' or 'eval' or 'single'");
Guido van Rossum5b722181993-03-30 17:46:03 +0000412 return NULL;
413 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000414 return Py_CompileString(str, filename, start);
Guido van Rossum5b722181993-03-30 17:46:03 +0000415}
416
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000417static char compile_doc[] =
418"compile(source, filename, mode) -> code object\n\
419\n\
420Compile the source string (a Python module, statement or expression)\n\
421into a code object that can be executed by the exec statement or eval().\n\
422The filename will be used for run-time error messages.\n\
423The mode must be 'exec' to compile a module, 'single' to compile a\n\
424single (interactive) statement, or 'eval' to compile an expression.";
425
426
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000427#ifndef WITHOUT_COMPLEX
428
Guido van Rossum79f25d91997-04-29 20:08:16 +0000429static PyObject *
Guido van Rossum11950231999-03-25 21:16:07 +0000430complex_from_string(v)
431 PyObject *v;
432{
433 extern double strtod Py_PROTO((const char *, char **));
Guido van Rossum9e896b32000-04-05 20:11:21 +0000434 const char *s, *start;
435 char *end;
Guido van Rossum11950231999-03-25 21:16:07 +0000436 double x=0.0, y=0.0, z;
437 int got_re=0, got_im=0, done=0;
438 int digit_or_dot;
439 int sw_error=0;
440 int sign;
441 char buffer[256]; /* For errors */
Guido van Rossum9e896b32000-04-05 20:11:21 +0000442 int len;
Guido van Rossum11950231999-03-25 21:16:07 +0000443
Guido van Rossum9e896b32000-04-05 20:11:21 +0000444 if (PyString_Check(v)) {
445 s = PyString_AS_STRING(v);
446 len = PyString_GET_SIZE(v);
447 }
448 else if (PyUnicode_Check(v)) {
449 char s_buffer[256];
450
451 if (PyUnicode_GET_SIZE(v) >= sizeof(s_buffer)) {
452 PyErr_SetString(PyExc_ValueError,
453 "complex() literal too large to convert");
454 return NULL;
455 }
456 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
457 PyUnicode_GET_SIZE(v),
458 s_buffer,
459 NULL))
460 return NULL;
461 s = s_buffer;
462 len = strlen(s);
463 }
464 else if (PyObject_AsCharBuffer(v, &s, &len)) {
465 PyErr_SetString(PyExc_TypeError,
466 "complex() needs a string first argument");
467 return NULL;
468 }
Guido van Rossum11950231999-03-25 21:16:07 +0000469
470 /* position on first nonblank */
Guido van Rossum9e896b32000-04-05 20:11:21 +0000471 start = s;
Guido van Rossum11950231999-03-25 21:16:07 +0000472 while (*s && isspace(Py_CHARMASK(*s)))
473 s++;
474 if (s[0] == '\0') {
475 PyErr_SetString(PyExc_ValueError,
476 "empty string for complex()");
477 return NULL;
478 }
479
480 z = -1.0;
481 sign = 1;
482 do {
483
484 switch (*s) {
485
486 case '\0':
Guido van Rossum9e896b32000-04-05 20:11:21 +0000487 if (s-start != len) {
Guido van Rossum11950231999-03-25 21:16:07 +0000488 PyErr_SetString(
489 PyExc_ValueError,
490 "null byte in argument for complex()");
491 return NULL;
492 }
493 if(!done) sw_error=1;
494 break;
495
496 case '-':
497 sign = -1;
498 /* Fallthrough */
499 case '+':
500 if (done) sw_error=1;
501 s++;
502 if ( *s=='\0'||*s=='+'||*s=='-' ||
503 isspace(Py_CHARMASK(*s)) ) sw_error=1;
504 break;
505
506 case 'J':
507 case 'j':
508 if (got_im || done) {
509 sw_error = 1;
510 break;
511 }
512 if (z<0.0) {
513 y=sign;
514 }
515 else{
516 y=sign*z;
517 }
518 got_im=1;
519 s++;
520 if (*s!='+' && *s!='-' )
521 done=1;
522 break;
523
524 default:
525 if (isspace(Py_CHARMASK(*s))) {
526 while (*s && isspace(Py_CHARMASK(*s)))
527 s++;
528 if (s[0] != '\0')
529 sw_error=1;
530 else
531 done = 1;
532 break;
533 }
534 digit_or_dot =
535 (*s=='.' || isdigit(Py_CHARMASK(*s)));
536 if (done||!digit_or_dot) {
537 sw_error=1;
538 break;
539 }
540 errno = 0;
541 PyFPE_START_PROTECT("strtod", return 0)
542 z = strtod(s, &end) ;
543 PyFPE_END_PROTECT(z)
544 if (errno != 0) {
545 sprintf(buffer,
546 "float() out of range: %.150s", s);
547 PyErr_SetString(
548 PyExc_ValueError,
549 buffer);
550 return NULL;
551 }
552 s=end;
553 if (*s=='J' || *s=='j') {
554
555 break;
556 }
557 if (got_re) {
558 sw_error=1;
559 break;
560 }
561
562 /* accept a real part */
563 x=sign*z;
564 got_re=1;
565 if (got_im) done=1;
566 z = -1.0;
567 sign = 1;
568 break;
569
570 } /* end of switch */
571
572 } while (*s!='\0' && !sw_error);
573
574 if (sw_error) {
575 PyErr_SetString(PyExc_ValueError,
576 "malformed string for complex()");
577 return NULL;
578 }
579
580 return PyComplex_FromDoubles(x,y);
581}
582
583static PyObject *
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000584builtin_complex(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000585 PyObject *self;
586 PyObject *args;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000587{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000588 PyObject *r, *i, *tmp;
589 PyNumberMethods *nbr, *nbi = NULL;
Guido van Rossum530956d1996-07-21 02:27:43 +0000590 Py_complex cr, ci;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000591 int own_r = 0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000592
593 i = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000594 if (!PyArg_ParseTuple(args, "O|O:complex", &r, &i))
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000595 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000596 if (PyString_Check(r) || PyUnicode_Check(r))
Guido van Rossum11950231999-03-25 21:16:07 +0000597 return complex_from_string(r);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000598 if ((nbr = r->ob_type->tp_as_number) == NULL ||
Guido van Rossumc6472e91997-03-31 17:15:43 +0000599 nbr->nb_float == NULL ||
600 (i != NULL &&
601 ((nbi = i->ob_type->tp_as_number) == NULL ||
602 nbi->nb_float == NULL))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000603 PyErr_SetString(PyExc_TypeError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000604 "complex() argument can't be converted to complex");
605 return NULL;
606 }
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000607 /* XXX Hack to support classes with __complex__ method */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000608 if (PyInstance_Check(r)) {
609 static PyObject *complexstr;
610 PyObject *f;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000611 if (complexstr == NULL) {
Guido van Rossum8d751611997-01-18 08:04:16 +0000612 complexstr = PyString_InternFromString("__complex__");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000613 if (complexstr == NULL)
614 return NULL;
615 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000616 f = PyObject_GetAttr(r, complexstr);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000617 if (f == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000618 PyErr_Clear();
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000619 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000620 PyObject *args = Py_BuildValue("()");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000621 if (args == NULL)
622 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000623 r = PyEval_CallObject(f, args);
624 Py_DECREF(args);
Barry Warsawf988e681999-01-27 23:13:59 +0000625 Py_DECREF(f);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000626 if (r == NULL)
627 return NULL;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000628 own_r = 1;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000629 }
630 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000631 if (PyComplex_Check(r)) {
632 cr = ((PyComplexObject*)r)->cval;
Guido van Rossum730806d1998-04-10 22:27:42 +0000633 if (own_r) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000634 Py_DECREF(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000635 }
Guido van Rossumc6472e91997-03-31 17:15:43 +0000636 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000637 else {
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000638 tmp = (*nbr->nb_float)(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000639 if (own_r) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000640 Py_DECREF(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000641 }
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000642 if (tmp == NULL)
643 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000644 cr.real = PyFloat_AsDouble(tmp);
645 Py_DECREF(tmp);
Guido van Rossum11950231999-03-25 21:16:07 +0000646 cr.imag = 0.0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000647 }
648 if (i == NULL) {
Guido van Rossum11950231999-03-25 21:16:07 +0000649 ci.real = 0.0;
650 ci.imag = 0.0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000651 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000652 else if (PyComplex_Check(i))
653 ci = ((PyComplexObject*)i)->cval;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000654 else {
Guido van Rossumc6472e91997-03-31 17:15:43 +0000655 tmp = (*nbi->nb_float)(i);
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000656 if (tmp == NULL)
657 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000658 ci.real = PyFloat_AsDouble(tmp);
659 Py_DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000660 ci.imag = 0.;
661 }
662 cr.real -= ci.imag;
663 cr.imag += ci.real;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000664 return PyComplex_FromCComplex(cr);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000665}
666
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000667static char complex_doc[] =
668"complex(real[, imag]) -> complex number\n\
669\n\
670Create a complex number from a real part and an optional imaginary part.\n\
671This is equivalent to (real + imag*1j) where imag defaults to 0.";
672
673
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000674#endif
675
Guido van Rossum79f25d91997-04-29 20:08:16 +0000676static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000677builtin_dir(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000678 PyObject *self;
679 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000680{
Guido van Rossum666b17a1997-05-06 16:36:57 +0000681 static char *attrlist[] = {"__members__", "__methods__", NULL};
682 PyObject *v = NULL, *l = NULL, *m = NULL;
683 PyObject *d, *x;
684 int i;
685 char **s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000686
Guido van Rossum79f25d91997-04-29 20:08:16 +0000687 if (!PyArg_ParseTuple(args, "|O:dir", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000688 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000689 if (v == NULL) {
Guido van Rossum666b17a1997-05-06 16:36:57 +0000690 x = PyEval_GetLocals();
691 if (x == NULL)
692 goto error;
693 l = PyMapping_Keys(x);
694 if (l == NULL)
695 goto error;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000696 }
697 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000698 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum666b17a1997-05-06 16:36:57 +0000699 if (d == NULL)
Guido van Rossum795ba581996-05-23 22:49:07 +0000700 PyErr_Clear();
Guido van Rossum666b17a1997-05-06 16:36:57 +0000701 else {
702 l = PyMapping_Keys(d);
703 if (l == NULL)
704 PyErr_Clear();
705 Py_DECREF(d);
706 }
707 if (l == NULL) {
708 l = PyList_New(0);
709 if (l == NULL)
710 goto error;
711 }
712 for (s = attrlist; *s != NULL; s++) {
713 m = PyObject_GetAttrString(v, *s);
714 if (m == NULL) {
715 PyErr_Clear();
716 continue;
717 }
718 for (i = 0; ; i++) {
719 x = PySequence_GetItem(m, i);
720 if (x == NULL) {
721 PyErr_Clear();
722 break;
723 }
724 if (PyList_Append(l, x) != 0) {
725 Py_DECREF(x);
726 Py_DECREF(m);
727 goto error;
728 }
729 Py_DECREF(x);
730 }
731 Py_DECREF(m);
Guido van Rossum795ba581996-05-23 22:49:07 +0000732 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000733 }
Guido van Rossum666b17a1997-05-06 16:36:57 +0000734 if (PyList_Sort(l) != 0)
735 goto error;
736 return l;
737 error:
738 Py_XDECREF(l);
739 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000740}
741
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000742static char dir_doc[] =
743"dir([object]) -> list of strings\n\
744\n\
745Return an alphabetized list of names comprising (some of) the attributes\n\
746of the given object. Without an argument, the names in the current scope\n\
747are listed. With an instance argument, only the instance attributes are\n\
748returned. With a class argument, attributes of the base class are not\n\
749returned. For other types or arguments, this may list members or methods.";
750
751
Guido van Rossum79f25d91997-04-29 20:08:16 +0000752static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000753builtin_divmod(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000754 PyObject *self;
755 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000756{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000757 PyObject *v, *w;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000758
Guido van Rossum79f25d91997-04-29 20:08:16 +0000759 if (!PyArg_ParseTuple(args, "OO:divmod", &v, &w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000760 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000761 return PyNumber_Divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000762}
763
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000764static char divmod_doc[] =
765"divmod(x, y) -> (div, mod)\n\
766\n\
767Return the tuple ((x-x%y)/y, x%y). Invariant: div*y + mod == x.";
768
769
Guido van Rossum79f25d91997-04-29 20:08:16 +0000770static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000771builtin_eval(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000772 PyObject *self;
773 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000774{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000775 PyObject *cmd;
776 PyObject *globals = Py_None, *locals = Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000777 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000778
Guido van Rossum79f25d91997-04-29 20:08:16 +0000779 if (!PyArg_ParseTuple(args, "O|O!O!:eval",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000780 &cmd,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000781 &PyDict_Type, &globals,
782 &PyDict_Type, &locals))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000783 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000784 if (globals == Py_None) {
785 globals = PyEval_GetGlobals();
786 if (locals == Py_None)
787 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000788 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000789 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000790 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000791 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
792 if (PyDict_SetItemString(globals, "__builtins__",
793 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000794 return NULL;
795 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000796 if (PyCode_Check(cmd))
797 return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals);
798 if (!PyString_Check(cmd)) {
799 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000800 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000801 return NULL;
802 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000803 str = PyString_AsString(cmd);
Guido van Rossum106f2da2000-06-28 21:12:25 +0000804 if (strlen(str) != (size_t)PyString_Size(cmd)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000805 PyErr_SetString(PyExc_ValueError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000806 "embedded '\\0' in string arg");
807 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000808 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000809 while (*str == ' ' || *str == '\t')
810 str++;
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000811 return PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000812}
813
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000814static char eval_doc[] =
815"eval(source[, globals[, locals]]) -> value\n\
816\n\
817Evaluate the source in the context of globals and locals.\n\
818The source may be a string representing a Python expression\n\
819or a code object as returned by compile().\n\
820The globals and locals are dictionaries, defaulting to the current\n\
821globals and locals. If only globals is given, locals defaults to it.";
822
823
Guido van Rossum79f25d91997-04-29 20:08:16 +0000824static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000825builtin_execfile(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000826 PyObject *self;
827 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000828{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000829 char *filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000830 PyObject *globals = Py_None, *locals = Py_None;
831 PyObject *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000832 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000833
Guido van Rossum79f25d91997-04-29 20:08:16 +0000834 if (!PyArg_ParseTuple(args, "s|O!O!:execfile",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000835 &filename,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000836 &PyDict_Type, &globals,
837 &PyDict_Type, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000838 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000839 if (globals == Py_None) {
840 globals = PyEval_GetGlobals();
841 if (locals == Py_None)
842 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000843 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000844 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000845 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000846 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
847 if (PyDict_SetItemString(globals, "__builtins__",
848 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000849 return NULL;
850 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000851 Py_BEGIN_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000852 fp = fopen(filename, "r");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000853 Py_END_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000854 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000855 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000856 return NULL;
857 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000858 res = PyRun_File(fp, filename, Py_file_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000859 Py_BEGIN_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000860 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000861 Py_END_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000862 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000863}
864
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000865static char execfile_doc[] =
866"execfile(filename[, globals[, locals]])\n\
867\n\
868Read and execute a Python script from a file.\n\
869The globals and locals are dictionaries, defaulting to the current\n\
870globals and locals. If only globals is given, locals defaults to it.";
871
872
Guido van Rossum79f25d91997-04-29 20:08:16 +0000873static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +0000874builtin_getattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000875 PyObject *self;
876 PyObject *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000877{
Guido van Rossum950ff291998-06-29 13:38:57 +0000878 PyObject *v, *result, *dflt = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000879 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000880
Guido van Rossum950ff291998-06-29 13:38:57 +0000881 if (!PyArg_ParseTuple(args, "OS|O:getattr", &v, &name, &dflt))
Guido van Rossum33894be1992-01-27 16:53:09 +0000882 return NULL;
Guido van Rossum950ff291998-06-29 13:38:57 +0000883 result = PyObject_GetAttr(v, name);
884 if (result == NULL && dflt != NULL) {
885 PyErr_Clear();
886 Py_INCREF(dflt);
887 result = dflt;
888 }
889 return result;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000890}
891
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000892static char getattr_doc[] =
Guido van Rossum950ff291998-06-29 13:38:57 +0000893"getattr(object, name[, default]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000894\n\
Guido van Rossum950ff291998-06-29 13:38:57 +0000895Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\n\
896When a default argument is given, it is returned when the attribute doesn't\n\
897exist; without it, an exception is raised in that case.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000898
899
Guido van Rossum79f25d91997-04-29 20:08:16 +0000900static PyObject *
Guido van Rossum872537c1995-07-07 22:43:42 +0000901builtin_globals(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000902 PyObject *self;
903 PyObject *args;
Guido van Rossum872537c1995-07-07 22:43:42 +0000904{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000905 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +0000906
Guido van Rossum43713e52000-02-29 13:59:29 +0000907 if (!PyArg_ParseTuple(args, ":globals"))
Guido van Rossum872537c1995-07-07 22:43:42 +0000908 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000909 d = PyEval_GetGlobals();
910 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +0000911 return d;
912}
913
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000914static char globals_doc[] =
915"globals() -> dictionary\n\
916\n\
917Return the dictionary containing the current scope's global variables.";
918
919
Guido van Rossum79f25d91997-04-29 20:08:16 +0000920static PyObject *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000921builtin_hasattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000922 PyObject *self;
923 PyObject *args;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000924{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000925 PyObject *v;
926 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000927
Guido van Rossum79f25d91997-04-29 20:08:16 +0000928 if (!PyArg_ParseTuple(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000929 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000930 v = PyObject_GetAttr(v, name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000931 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000932 PyErr_Clear();
Guido van Rossum09df08a1998-05-22 00:51:39 +0000933 Py_INCREF(Py_False);
934 return Py_False;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000935 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000936 Py_DECREF(v);
Guido van Rossum09df08a1998-05-22 00:51:39 +0000937 Py_INCREF(Py_True);
938 return Py_True;
Guido van Rossum33894be1992-01-27 16:53:09 +0000939}
940
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000941static char hasattr_doc[] =
942"hasattr(object, name) -> Boolean\n\
943\n\
944Return whether the object has an attribute with the given name.\n\
945(This is done by calling getattr(object, name) and catching exceptions.)";
946
947
Guido van Rossum79f25d91997-04-29 20:08:16 +0000948static PyObject *
Guido van Rossum5b722181993-03-30 17:46:03 +0000949builtin_id(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000950 PyObject *self;
951 PyObject *args;
Guido van Rossum5b722181993-03-30 17:46:03 +0000952{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000953 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000954
Guido van Rossum79f25d91997-04-29 20:08:16 +0000955 if (!PyArg_ParseTuple(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000956 return NULL;
Guido van Rossum106f2da2000-06-28 21:12:25 +0000957 return PyLong_FromVoidPtr(v);
Guido van Rossum5b722181993-03-30 17:46:03 +0000958}
959
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000960static char id_doc[] =
961"id(object) -> integer\n\
962\n\
963Return the identity of an object. This is guaranteed to be unique among\n\
964simultaneously existing objects. (Hint: it's the object's memory address.)";
965
966
Guido van Rossum79f25d91997-04-29 20:08:16 +0000967static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000968builtin_map(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000969 PyObject *self;
970 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000971{
972 typedef struct {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000973 PyObject *seq;
974 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000975 int len;
976 } sequence;
977
Guido van Rossum79f25d91997-04-29 20:08:16 +0000978 PyObject *func, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000979 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000980 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000981 register int i, j;
982
Guido van Rossum79f25d91997-04-29 20:08:16 +0000983 n = PyTuple_Size(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000984 if (n < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000985 PyErr_SetString(PyExc_TypeError,
986 "map() requires at least two args");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000987 return NULL;
988 }
989
Guido van Rossum79f25d91997-04-29 20:08:16 +0000990 func = PyTuple_GetItem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000991 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000992
Guido van Rossumfa4ac711998-07-10 17:37:30 +0000993 if (func == Py_None && n == 1) {
994 /* map(None, S) is the same as list(S). */
995 return PySequence_List(PyTuple_GetItem(args, 1));
996 }
997
Guido van Rossum79f25d91997-04-29 20:08:16 +0000998 if ((seqs = PyMem_NEW(sequence, n)) == NULL) {
999 PyErr_NoMemory();
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001000 goto Fail_2;
1001 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001002
Guido van Rossum2d951851994-08-29 12:52:16 +00001003 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001004 int curlen;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001005 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001006
Guido van Rossum79f25d91997-04-29 20:08:16 +00001007 if ((sqp->seq = PyTuple_GetItem(args, i + 1)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001008 goto Fail_2;
1009
Guido van Rossum09df08a1998-05-22 00:51:39 +00001010 sqp->sqf = sqf = sqp->seq->ob_type->tp_as_sequence;
1011 if (sqf == NULL ||
1012 sqf->sq_length == NULL ||
1013 sqf->sq_item == NULL)
1014 {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001015 static char errmsg[] =
1016 "argument %d to map() must be a sequence object";
Guido van Rossum15e33a41997-04-30 19:00:27 +00001017 char errbuf[sizeof(errmsg) + 25];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001018
1019 sprintf(errbuf, errmsg, i+2);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001020 PyErr_SetString(PyExc_TypeError, errbuf);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001021 goto Fail_2;
1022 }
1023
1024 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
1025 goto Fail_2;
1026
1027 if (curlen > len)
1028 len = curlen;
1029 }
1030
Guido van Rossum79f25d91997-04-29 20:08:16 +00001031 if ((result = (PyObject *) PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001032 goto Fail_2;
1033
Guido van Rossum2d951851994-08-29 12:52:16 +00001034 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001035 PyObject *alist, *item=NULL, *value;
Guido van Rossum2d951851994-08-29 12:52:16 +00001036 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001037
Guido van Rossum79f25d91997-04-29 20:08:16 +00001038 if (func == Py_None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +00001039 alist = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001040 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001041 if ((alist = PyTuple_New(n)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001042 goto Fail_1;
1043 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001044
1045 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +00001046 if (sqp->len < 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001047 Py_INCREF(Py_None);
1048 item = Py_None;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001049 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001050 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001051 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +00001052 if (item == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001053 if (PyErr_ExceptionMatches(
1054 PyExc_IndexError))
1055 {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001056 PyErr_Clear();
1057 Py_INCREF(Py_None);
1058 item = Py_None;
Guido van Rossum2d951851994-08-29 12:52:16 +00001059 sqp->len = -1;
1060 }
1061 else {
1062 goto Fail_0;
1063 }
1064 }
1065 else
1066 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001067
Guido van Rossum12d12c51993-10-26 17:58:25 +00001068 }
Guido van Rossum32120311995-07-10 13:52:21 +00001069 if (!alist)
Guido van Rossum2d951851994-08-29 12:52:16 +00001070 break;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001071 if (PyTuple_SetItem(alist, j, item) < 0) {
1072 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001073 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +00001074 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001075 continue;
1076
1077 Fail_0:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001078 Py_XDECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001079 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001080 }
1081
Guido van Rossum32120311995-07-10 13:52:21 +00001082 if (!alist)
1083 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +00001084
1085 if (!any) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001086 Py_DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +00001087 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001088 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001089
Guido van Rossum79f25d91997-04-29 20:08:16 +00001090 if (func == Py_None)
Guido van Rossum32120311995-07-10 13:52:21 +00001091 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001092 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001093 value = PyEval_CallObject(func, alist);
1094 Py_DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001095 if (value == NULL)
1096 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +00001097 }
1098 if (i >= len) {
Barry Warsawfa77e091999-01-28 18:49:12 +00001099 int status = PyList_Append(result, value);
Barry Warsaw21332871999-01-28 04:21:35 +00001100 Py_DECREF(value);
Barry Warsawfa77e091999-01-28 18:49:12 +00001101 if (status < 0)
1102 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +00001103 }
1104 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001105 if (PyList_SetItem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001106 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001107 }
1108 }
1109
Guido van Rossumfa4ac711998-07-10 17:37:30 +00001110 if (i < len && PyList_SetSlice(result, i, len, NULL) < 0)
1111 goto Fail_1;
1112
Guido van Rossum79f25d91997-04-29 20:08:16 +00001113 PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001114 return result;
1115
Guido van Rossum12d12c51993-10-26 17:58:25 +00001116Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001117 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001118Fail_2:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001119 if (seqs) PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001120 return NULL;
1121}
1122
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001123static char map_doc[] =
1124"map(function, sequence[, sequence, ...]) -> list\n\
1125\n\
1126Return a list of the results of applying the function to the items of\n\
1127the argument sequence(s). If more than one sequence is given, the\n\
1128function is called with an argument list consisting of the corresponding\n\
1129item of each sequence, substituting None for missing values when not all\n\
1130sequences have the same length. If the function is None, return a list of\n\
1131the items of the sequence (or a list of tuples if more than one sequence).";
1132
1133
Guido van Rossum79f25d91997-04-29 20:08:16 +00001134static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +00001135builtin_setattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001136 PyObject *self;
1137 PyObject *args;
Guido van Rossum33894be1992-01-27 16:53:09 +00001138{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001139 PyObject *v;
1140 PyObject *name;
1141 PyObject *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001142
Guido van Rossum79f25d91997-04-29 20:08:16 +00001143 if (!PyArg_ParseTuple(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +00001144 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001145 if (PyObject_SetAttr(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +00001146 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001147 Py_INCREF(Py_None);
1148 return Py_None;
Guido van Rossum33894be1992-01-27 16:53:09 +00001149}
1150
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001151static char setattr_doc[] =
1152"setattr(object, name, value)\n\
1153\n\
1154Set a named attribute on an object; setattr(x, 'y', v) is equivalent to\n\
1155``x.y = v''.";
1156
1157
Guido van Rossum79f25d91997-04-29 20:08:16 +00001158static PyObject *
Guido van Rossum14144fc1994-08-29 12:53:40 +00001159builtin_delattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001160 PyObject *self;
1161 PyObject *args;
Guido van Rossum14144fc1994-08-29 12:53:40 +00001162{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001163 PyObject *v;
1164 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001165
Guido van Rossum79f25d91997-04-29 20:08:16 +00001166 if (!PyArg_ParseTuple(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +00001167 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001168 if (PyObject_SetAttr(v, name, (PyObject *)NULL) != 0)
Guido van Rossum14144fc1994-08-29 12:53:40 +00001169 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001170 Py_INCREF(Py_None);
1171 return Py_None;
Guido van Rossum14144fc1994-08-29 12:53:40 +00001172}
1173
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001174static char delattr_doc[] =
Guido van Rossumdf12a591998-11-23 22:13:04 +00001175"delattr(object, name)\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001176\n\
1177Delete a named attribute on an object; delattr(x, 'y') is equivalent to\n\
1178``del x.y''.";
1179
1180
Guido van Rossum79f25d91997-04-29 20:08:16 +00001181static PyObject *
Guido van Rossum9bfef441993-03-29 10:43:31 +00001182builtin_hash(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001183 PyObject *self;
1184 PyObject *args;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001185{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001186 PyObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001187 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001188
Guido van Rossum79f25d91997-04-29 20:08:16 +00001189 if (!PyArg_ParseTuple(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +00001190 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001191 x = PyObject_Hash(v);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001192 if (x == -1)
1193 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001194 return PyInt_FromLong(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001195}
1196
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001197static char hash_doc[] =
1198"hash(object) -> integer\n\
1199\n\
1200Return a hash value for the object. Two objects with the same value have\n\
1201the same hash value. The reverse is not necessarily true, but likely.";
1202
1203
Guido van Rossum79f25d91997-04-29 20:08:16 +00001204static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001205builtin_hex(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001206 PyObject *self;
1207 PyObject *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001208{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001209 PyObject *v;
1210 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001211
Guido van Rossum79f25d91997-04-29 20:08:16 +00001212 if (!PyArg_ParseTuple(args, "O:hex", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001213 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001214
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001215 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001216 nb->nb_hex == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001217 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001218 "hex() argument can't be converted to hex");
1219 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001220 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001221 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001222}
1223
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001224static char hex_doc[] =
1225"hex(number) -> string\n\
1226\n\
1227Return the hexadecimal representation of an integer or long integer.";
1228
1229
Guido van Rossum79f25d91997-04-29 20:08:16 +00001230static PyObject *builtin_raw_input Py_PROTO((PyObject *, PyObject *));
Guido van Rossum3165fe61992-09-25 21:59:05 +00001231
Guido van Rossum79f25d91997-04-29 20:08:16 +00001232static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001233builtin_input(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001234 PyObject *self;
1235 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001236{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001237 PyObject *line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001238 char *str;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001239 PyObject *res;
1240 PyObject *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001241
1242 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001243 if (line == NULL)
1244 return line;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001245 if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001246 return NULL;
1247 while (*str == ' ' || *str == '\t')
1248 str++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001249 globals = PyEval_GetGlobals();
1250 locals = PyEval_GetLocals();
1251 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
1252 if (PyDict_SetItemString(globals, "__builtins__",
1253 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +00001254 return NULL;
1255 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00001256 res = PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001257 Py_DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001258 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001259}
1260
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001261static char input_doc[] =
1262"input([prompt]) -> value\n\
1263\n\
1264Equivalent to eval(raw_input(prompt)).";
1265
1266
Guido van Rossume8811f81997-02-14 15:48:05 +00001267static PyObject *
1268builtin_intern(self, args)
1269 PyObject *self;
1270 PyObject *args;
1271{
1272 PyObject *s;
Guido van Rossum43713e52000-02-29 13:59:29 +00001273 if (!PyArg_ParseTuple(args, "S:intern", &s))
Guido van Rossume8811f81997-02-14 15:48:05 +00001274 return NULL;
1275 Py_INCREF(s);
1276 PyString_InternInPlace(&s);
1277 return s;
1278}
1279
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001280static char intern_doc[] =
1281"intern(string) -> string\n\
1282\n\
1283``Intern'' the given string. This enters the string in the (global)\n\
1284table of interned strings whose purpose is to speed up dictionary lookups.\n\
1285Return the string itself or the previously interned string object with the\n\
1286same value.";
1287
1288
Guido van Rossum79f25d91997-04-29 20:08:16 +00001289static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001290builtin_int(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001291 PyObject *self;
1292 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001293{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001294 PyObject *v;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001295 int base = -909; /* unlikely! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001296
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001297 if (!PyArg_ParseTuple(args, "O|i:int", &v, &base))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001298 return NULL;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001299 if (base == -909)
1300 return PyNumber_Int(v);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001301 else if (PyString_Check(v))
1302 return PyInt_FromString(PyString_AS_STRING(v), NULL, base);
1303 else if (PyUnicode_Check(v))
1304 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(v),
1305 PyUnicode_GET_SIZE(v),
1306 base);
1307 else {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001308 PyErr_SetString(PyExc_TypeError,
1309 "can't convert non-string with explicit base");
1310 return NULL;
1311 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001312}
1313
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001314static char int_doc[] =
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001315"int(x[, base]) -> integer\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001316\n\
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001317Convert a string or number to an integer, if possible. A floating point\n\
1318argument will be truncated towards zero (this does not include a string\n\
1319representation of a floating point number!) When converting a string, use\n\
1320the optional base. It is an error to supply a base when converting a\n\
1321non-string.";
1322
1323
1324static PyObject *
1325builtin_long(self, args)
1326 PyObject *self;
1327 PyObject *args;
1328{
1329 PyObject *v;
1330 int base = -909; /* unlikely! */
1331
1332 if (!PyArg_ParseTuple(args, "O|i:long", &v, &base))
1333 return NULL;
1334 if (base == -909)
1335 return PyNumber_Long(v);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001336 else if (PyString_Check(v))
1337 return PyLong_FromString(PyString_AS_STRING(v), NULL, base);
1338 else if (PyUnicode_Check(v))
1339 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(v),
1340 PyUnicode_GET_SIZE(v),
1341 base);
1342 else {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001343 PyErr_SetString(PyExc_TypeError,
1344 "can't convert non-string with explicit base");
1345 return NULL;
1346 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001347}
1348
1349static char long_doc[] =
1350"long(x) -> long integer\n\
1351long(x, base) -> long integer\n\
1352\n\
1353Convert a string or number to a long integer, if possible. A floating\n\
1354point argument will be truncated towards zero (this does not include a\n\
1355string representation of a floating point number!) When converting a\n\
1356string, use the given base. It is an error to supply a base when\n\
1357converting a non-string.";
1358
1359
1360static PyObject *
1361builtin_float(self, args)
1362 PyObject *self;
1363 PyObject *args;
1364{
1365 PyObject *v;
1366
1367 if (!PyArg_ParseTuple(args, "O:float", &v))
1368 return NULL;
1369 if (PyString_Check(v))
1370 return PyFloat_FromString(v, NULL);
1371 return PyNumber_Float(v);
1372}
1373
1374static char float_doc[] =
1375"float(x) -> floating point number\n\
1376\n\
1377Convert a string or number to a floating point number, if possible.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001378
1379
Guido van Rossum79f25d91997-04-29 20:08:16 +00001380static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001381builtin_len(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001382 PyObject *self;
1383 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001384{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001385 PyObject *v;
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001386 long res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001387
Guido van Rossum79f25d91997-04-29 20:08:16 +00001388 if (!PyArg_ParseTuple(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001389 return NULL;
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001390 res = PyObject_Length(v);
1391 if (res < 0 && PyErr_Occurred())
1392 return NULL;
1393 return PyInt_FromLong(res);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001394}
1395
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001396static char len_doc[] =
1397"len(object) -> integer\n\
1398\n\
1399Return the number of items of a sequence or mapping.";
1400
1401
Guido van Rossum79f25d91997-04-29 20:08:16 +00001402static PyObject *
Guido van Rossumd1705771996-04-09 02:41:06 +00001403builtin_list(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001404 PyObject *self;
1405 PyObject *args;
Guido van Rossumd1705771996-04-09 02:41:06 +00001406{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001407 PyObject *v;
Guido van Rossumd1705771996-04-09 02:41:06 +00001408
Guido van Rossum79f25d91997-04-29 20:08:16 +00001409 if (!PyArg_ParseTuple(args, "O:list", &v))
Guido van Rossumd1705771996-04-09 02:41:06 +00001410 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001411 return PySequence_List(v);
Guido van Rossumd1705771996-04-09 02:41:06 +00001412}
1413
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001414static char list_doc[] =
1415"list(sequence) -> list\n\
1416\n\
1417Return a new list whose items are the same as those of the argument sequence.";
1418
Guido van Rossum8861b741996-07-30 16:49:37 +00001419
1420static PyObject *
1421builtin_slice(self, args)
1422 PyObject *self;
1423 PyObject *args;
1424{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001425 PyObject *start, *stop, *step;
Guido van Rossum8861b741996-07-30 16:49:37 +00001426
Guido van Rossum09df08a1998-05-22 00:51:39 +00001427 start = stop = step = NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001428
Guido van Rossum09df08a1998-05-22 00:51:39 +00001429 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
1430 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001431
Guido van Rossum09df08a1998-05-22 00:51:39 +00001432 /* This swapping of stop and start is to maintain similarity with
1433 range(). */
1434 if (stop == NULL) {
1435 stop = start;
1436 start = NULL;
1437 }
1438 return PySlice_New(start, stop, step);
Guido van Rossum8861b741996-07-30 16:49:37 +00001439}
1440
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001441static char slice_doc[] =
Fred Drake3d587441999-07-19 15:21:16 +00001442"slice([start,] stop[, step]) -> slice object\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001443\n\
1444Create a slice object. This is used for slicing by the Numeric extensions.";
1445
1446
Guido van Rossum79f25d91997-04-29 20:08:16 +00001447static PyObject *
Guido van Rossum872537c1995-07-07 22:43:42 +00001448builtin_locals(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001449 PyObject *self;
1450 PyObject *args;
Guido van Rossum872537c1995-07-07 22:43:42 +00001451{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001452 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +00001453
Guido van Rossum43713e52000-02-29 13:59:29 +00001454 if (!PyArg_ParseTuple(args, ":locals"))
Guido van Rossum872537c1995-07-07 22:43:42 +00001455 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001456 d = PyEval_GetLocals();
1457 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +00001458 return d;
1459}
1460
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001461static char locals_doc[] =
1462"locals() -> dictionary\n\
1463\n\
1464Return the dictionary containing the current scope's local variables.";
1465
1466
Guido van Rossum79f25d91997-04-29 20:08:16 +00001467static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001468min_max(args, sign)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001469 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001470 int sign;
1471{
Guido van Rossum2d951851994-08-29 12:52:16 +00001472 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001473 PyObject *v, *w, *x;
1474 PySequenceMethods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001475
Guido van Rossum79f25d91997-04-29 20:08:16 +00001476 if (PyTuple_Size(args) > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001477 v = args;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001478 else if (!PyArg_ParseTuple(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001479 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001480 sq = v->ob_type->tp_as_sequence;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001481 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001482 PyErr_SetString(PyExc_TypeError,
1483 "min() or max() of non-sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001484 return NULL;
1485 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001486 w = NULL;
1487 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001488 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +00001489 if (x == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001490 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001491 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001492 break;
1493 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001494 Py_XDECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001495 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001496 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001497 if (w == NULL)
1498 w = x;
1499 else {
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001500 int c = PyObject_Compare(x, w);
1501 if (c && PyErr_Occurred()) {
1502 Py_DECREF(x);
1503 Py_XDECREF(w);
1504 return NULL;
1505 }
1506 if (c * sign > 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001507 Py_DECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001508 w = x;
1509 }
1510 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001511 Py_DECREF(x);
Guido van Rossum2d951851994-08-29 12:52:16 +00001512 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001513 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001514 if (w == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001515 PyErr_SetString(PyExc_ValueError,
1516 "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001517 return w;
1518}
1519
Guido van Rossum79f25d91997-04-29 20:08:16 +00001520static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001521builtin_min(self, v)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001522 PyObject *self;
1523 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001524{
1525 return min_max(v, -1);
1526}
1527
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001528static char min_doc[] =
1529"min(sequence) -> value\n\
1530min(a, b, c, ...) -> value\n\
1531\n\
1532With a single sequence argument, return its smallest item.\n\
1533With two or more arguments, return the smallest argument.";
1534
1535
Guido van Rossum79f25d91997-04-29 20:08:16 +00001536static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001537builtin_max(self, v)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001538 PyObject *self;
1539 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001540{
1541 return min_max(v, 1);
1542}
1543
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001544static char max_doc[] =
1545"max(sequence) -> value\n\
1546max(a, b, c, ...) -> value\n\
1547\n\
1548With a single sequence argument, return its largest item.\n\
1549With two or more arguments, return the largest argument.";
1550
1551
Guido van Rossum79f25d91997-04-29 20:08:16 +00001552static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001553builtin_oct(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001554 PyObject *self;
1555 PyObject *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001556{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001557 PyObject *v;
1558 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001559
Guido van Rossum79f25d91997-04-29 20:08:16 +00001560 if (!PyArg_ParseTuple(args, "O:oct", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001561 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001562 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1563 nb->nb_oct == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001564 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001565 "oct() argument can't be converted to oct");
1566 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001567 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001568 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001569}
1570
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001571static char oct_doc[] =
1572"oct(number) -> string\n\
1573\n\
1574Return the octal representation of an integer or long integer.";
1575
1576
Guido van Rossum79f25d91997-04-29 20:08:16 +00001577static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +00001578builtin_open(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001579 PyObject *self;
1580 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001581{
Guido van Rossum2d951851994-08-29 12:52:16 +00001582 char *name;
1583 char *mode = "r";
1584 int bufsize = -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001585 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001586
Guido van Rossum79f25d91997-04-29 20:08:16 +00001587 if (!PyArg_ParseTuple(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001588 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001589 f = PyFile_FromString(name, mode);
Guido van Rossum2d951851994-08-29 12:52:16 +00001590 if (f != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001591 PyFile_SetBufSize(f, bufsize);
Guido van Rossum2d951851994-08-29 12:52:16 +00001592 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001593}
1594
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001595static char open_doc[] =
1596"open(filename[, mode[, buffering]]) -> file object\n\
1597\n\
1598Open a file. The mode can be 'r', 'w' or 'a' for reading (default),\n\
1599writing or appending. The file will be created if it doesn't exist\n\
1600when opened for writing or appending; it will be truncated when\n\
1601opened for writing. Add a 'b' to the mode for binary files.\n\
1602Add a '+' to the mode to allow simultaneous reading and writing.\n\
1603If the buffering argument is given, 0 means unbuffered, 1 means line\n\
1604buffered, and larger numbers specify the buffer size.";
1605
1606
Guido van Rossum79f25d91997-04-29 20:08:16 +00001607static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +00001608builtin_ord(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001609 PyObject *self;
1610 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001611{
Guido van Rossum09095f32000-03-10 23:00:52 +00001612 PyObject *obj;
1613 long ord;
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001614 int size;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001615
Guido van Rossum09095f32000-03-10 23:00:52 +00001616 if (!PyArg_ParseTuple(args, "O:ord", &obj))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001617 return NULL;
Guido van Rossum09095f32000-03-10 23:00:52 +00001618
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001619 if (PyString_Check(obj)) {
1620 size = PyString_GET_SIZE(obj);
1621 if (size == 1)
1622 ord = (long)((unsigned char)*PyString_AS_STRING(obj));
1623 } else if (PyUnicode_Check(obj)) {
1624 size = PyUnicode_GET_SIZE(obj);
1625 if (size == 1)
1626 ord = (long)*PyUnicode_AS_UNICODE(obj);
1627 } else {
1628 PyErr_Format(PyExc_TypeError,
Fred Drake078b24f2000-04-13 02:42:50 +00001629 "expected string or Unicode character, " \
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001630 "%.200s found", obj->ob_type->tp_name);
Guido van Rossum09095f32000-03-10 23:00:52 +00001631 return NULL;
1632 }
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001633 if (size == 1)
1634 return PyInt_FromLong(ord);
Guido van Rossum09095f32000-03-10 23:00:52 +00001635
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001636 PyErr_Format(PyExc_TypeError,
1637 "expected a character, length-%d string found",
1638 size);
1639 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001640}
1641
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001642static char ord_doc[] =
1643"ord(c) -> integer\n\
1644\n\
Fred Drake078b24f2000-04-13 02:42:50 +00001645Return the integer ordinal of a one character string.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001646
1647
Guido van Rossum79f25d91997-04-29 20:08:16 +00001648static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001649builtin_pow(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001650 PyObject *self;
1651 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001652{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001653 PyObject *v, *w, *z = Py_None;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001654
Guido van Rossum79f25d91997-04-29 20:08:16 +00001655 if (!PyArg_ParseTuple(args, "OO|O:pow", &v, &w, &z))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001656 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001657 return PyNumber_Power(v, w, z);
Guido van Rossumd4905451991-05-05 20:00:36 +00001658}
1659
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001660static char pow_doc[] =
1661"pow(x, y[, z]) -> number\n\
1662\n\
1663With two arguments, equivalent to x**y. With three arguments,\n\
1664equivalent to (x**y) % z, but may be more efficient (e.g. for longs).";
1665
1666
Guido van Rossum124eff01999-02-23 16:11:01 +00001667/* Return number of items in range/xrange (lo, hi, step). step > 0
1668 * required. Return a value < 0 if & only if the true value is too
1669 * large to fit in a signed long.
1670 */
1671static long
1672get_len_of_range(lo, hi, step)
1673 long lo;
1674 long hi;
1675 long step; /* must be > 0 */
1676{
1677 /* -------------------------------------------------------------
1678 If lo >= hi, the range is empty.
1679 Else if n values are in the range, the last one is
1680 lo + (n-1)*step, which must be <= hi-1. Rearranging,
1681 n <= (hi - lo - 1)/step + 1, so taking the floor of the RHS gives
1682 the proper value. Since lo < hi in this case, hi-lo-1 >= 0, so
1683 the RHS is non-negative and so truncation is the same as the
1684 floor. Letting M be the largest positive long, the worst case
1685 for the RHS numerator is hi=M, lo=-M-1, and then
1686 hi-lo-1 = M-(-M-1)-1 = 2*M. Therefore unsigned long has enough
1687 precision to compute the RHS exactly.
1688 ---------------------------------------------------------------*/
1689 long n = 0;
1690 if (lo < hi) {
1691 unsigned long uhi = (unsigned long)hi;
1692 unsigned long ulo = (unsigned long)lo;
1693 unsigned long diff = uhi - ulo - 1;
1694 n = (long)(diff / (unsigned long)step + 1);
1695 }
1696 return n;
1697}
1698
Guido van Rossum79f25d91997-04-29 20:08:16 +00001699static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001700builtin_range(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001701 PyObject *self;
1702 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001703{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001704 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum124eff01999-02-23 16:11:01 +00001705 long bign;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001706 int i, n;
Guido van Rossum124eff01999-02-23 16:11:01 +00001707
Guido van Rossum79f25d91997-04-29 20:08:16 +00001708 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001709
Guido van Rossum79f25d91997-04-29 20:08:16 +00001710 if (PyTuple_Size(args) <= 1) {
1711 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001712 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001713 &ihigh))
1714 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001715 }
1716 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001717 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001718 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001719 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001720 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001721 }
1722 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001723 PyErr_SetString(PyExc_ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001724 return NULL;
1725 }
Guido van Rossum124eff01999-02-23 16:11:01 +00001726 if (istep > 0)
1727 bign = get_len_of_range(ilow, ihigh, istep);
1728 else
1729 bign = get_len_of_range(ihigh, ilow, -istep);
1730 n = (int)bign;
1731 if (bign < 0 || (long)n != bign) {
Guido van Rossume23cde21999-01-12 05:07:47 +00001732 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum124eff01999-02-23 16:11:01 +00001733 "range() has too many items");
Guido van Rossume23cde21999-01-12 05:07:47 +00001734 return NULL;
1735 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001736 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001737 if (v == NULL)
1738 return NULL;
1739 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001740 PyObject *w = PyInt_FromLong(ilow);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001741 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001742 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001743 return NULL;
1744 }
Guido van Rossuma937d141998-04-24 18:22:02 +00001745 PyList_SET_ITEM(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001746 ilow += istep;
1747 }
1748 return v;
1749}
1750
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001751static char range_doc[] =
1752"range([start,] stop[, step]) -> list of integers\n\
1753\n\
1754Return a list containing an arithmetic progression of integers.\n\
1755range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.\n\
1756When step is given, it specifies the increment (or decrement).\n\
1757For example, range(4) returns [0, 1, 2, 3]. The end point is omitted!\n\
1758These are exactly the valid indices for a list of 4 elements.";
1759
1760
Guido van Rossum79f25d91997-04-29 20:08:16 +00001761static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001762builtin_xrange(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001763 PyObject *self;
1764 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001765{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001766 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001767 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001768
Guido van Rossum79f25d91997-04-29 20:08:16 +00001769 if (PyTuple_Size(args) <= 1) {
1770 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001771 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001772 &ihigh))
1773 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001774 }
1775 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001776 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001777 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001778 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001779 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001780 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001781 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001782 PyErr_SetString(PyExc_ValueError, "zero step for xrange()");
Guido van Rossum12d12c51993-10-26 17:58:25 +00001783 return NULL;
1784 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001785 if (istep > 0)
Guido van Rossum124eff01999-02-23 16:11:01 +00001786 n = get_len_of_range(ilow, ihigh, istep);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001787 else
Guido van Rossum124eff01999-02-23 16:11:01 +00001788 n = get_len_of_range(ihigh, ilow, -istep);
1789 if (n < 0) {
1790 PyErr_SetString(PyExc_OverflowError,
1791 "xrange() has more than sys.maxint items");
1792 return NULL;
1793 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001794 return PyRange_New(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001795}
1796
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001797static char xrange_doc[] =
1798"xrange([start,] stop[, step]) -> xrange object\n\
1799\n\
1800Like range(), but instead of returning a list, returns an object that\n\
1801generates the numbers in the range on demand. This is slightly slower\n\
1802than range() but more memory efficient.";
1803
1804
Guido van Rossum79f25d91997-04-29 20:08:16 +00001805static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001806builtin_raw_input(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001807 PyObject *self;
1808 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001809{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001810 PyObject *v = NULL;
1811 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001812
Guido van Rossum79f25d91997-04-29 20:08:16 +00001813 if (!PyArg_ParseTuple(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001814 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001815 if (PyFile_AsFile(PySys_GetObject("stdin")) == stdin &&
1816 PyFile_AsFile(PySys_GetObject("stdout")) == stdout &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001817 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001818 PyObject *po;
Guido van Rossum872537c1995-07-07 22:43:42 +00001819 char *prompt;
1820 char *s;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001821 PyObject *result;
Guido van Rossum872537c1995-07-07 22:43:42 +00001822 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001823 po = PyObject_Str(v);
Guido van Rossum872537c1995-07-07 22:43:42 +00001824 if (po == NULL)
1825 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001826 prompt = PyString_AsString(po);
Guido van Rossumd9b52081998-06-26 18:25:38 +00001827 if (prompt == NULL)
1828 return NULL;
Guido van Rossum872537c1995-07-07 22:43:42 +00001829 }
1830 else {
1831 po = NULL;
1832 prompt = "";
1833 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001834 s = PyOS_Readline(prompt);
1835 Py_XDECREF(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001836 if (s == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001837 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossum872537c1995-07-07 22:43:42 +00001838 return NULL;
1839 }
1840 if (*s == '\0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001841 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum872537c1995-07-07 22:43:42 +00001842 result = NULL;
1843 }
1844 else { /* strip trailing '\n' */
Guido van Rossum106f2da2000-06-28 21:12:25 +00001845 size_t len = strlen(s);
1846 if (len > INT_MAX) {
1847 PyErr_SetString(PyExc_OverflowError, "input too long");
1848 result = NULL;
1849 }
1850 else {
1851 result = PyString_FromStringAndSize(s, (int)(len-1));
1852 }
Guido van Rossum872537c1995-07-07 22:43:42 +00001853 }
Guido van Rossumb18618d2000-05-03 23:44:39 +00001854 PyMem_FREE(s);
Guido van Rossum872537c1995-07-07 22:43:42 +00001855 return result;
1856 }
Guido van Rossum90933611991-06-07 16:10:43 +00001857 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001858 f = PySys_GetObject("stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001859 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001860 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001861 return NULL;
1862 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001863 if (Py_FlushLine() != 0 ||
1864 PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001865 return NULL;
1866 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001867 f = PySys_GetObject("stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001868 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001869 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001870 return NULL;
1871 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001872 return PyFile_GetLine(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001873}
1874
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001875static char raw_input_doc[] =
1876"raw_input([prompt]) -> string\n\
1877\n\
1878Read a string from standard input. The trailing newline is stripped.\n\
1879If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.\n\
1880On Unix, GNU readline is used if enabled. The prompt string, if given,\n\
1881is printed without a trailing newline before reading.";
1882
1883
Guido van Rossum79f25d91997-04-29 20:08:16 +00001884static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001885builtin_reduce(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001886 PyObject *self;
1887 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001888{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001889 PyObject *seq, *func, *result = NULL;
1890 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001891 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001892
Guido van Rossum79f25d91997-04-29 20:08:16 +00001893 if (!PyArg_ParseTuple(args, "OO|O:reduce", &func, &seq, &result))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001894 return NULL;
1895 if (result != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001896 Py_INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001897
Guido van Rossum09df08a1998-05-22 00:51:39 +00001898 sqf = seq->ob_type->tp_as_sequence;
1899 if (sqf == NULL || sqf->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001900 PyErr_SetString(PyExc_TypeError,
Guido van Rossum12d12c51993-10-26 17:58:25 +00001901 "2nd argument to reduce() must be a sequence object");
1902 return NULL;
1903 }
1904
Guido van Rossum79f25d91997-04-29 20:08:16 +00001905 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001906 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001907
Guido van Rossum2d951851994-08-29 12:52:16 +00001908 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001909 PyObject *op2;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001910
1911 if (args->ob_refcnt > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001912 Py_DECREF(args);
1913 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001914 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001915 }
1916
Guido van Rossum2d951851994-08-29 12:52:16 +00001917 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001918 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001919 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001920 break;
1921 }
1922 goto Fail;
1923 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001924
Guido van Rossum2d951851994-08-29 12:52:16 +00001925 if (result == NULL)
1926 result = op2;
1927 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001928 PyTuple_SetItem(args, 0, result);
1929 PyTuple_SetItem(args, 1, op2);
1930 if ((result = PyEval_CallObject(func, args)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001931 goto Fail;
1932 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001933 }
1934
Guido van Rossum79f25d91997-04-29 20:08:16 +00001935 Py_DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001936
Guido van Rossum2d951851994-08-29 12:52:16 +00001937 if (result == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001938 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001939 "reduce of empty sequence with no initial value");
1940
Guido van Rossum12d12c51993-10-26 17:58:25 +00001941 return result;
1942
Guido van Rossum2d951851994-08-29 12:52:16 +00001943Fail:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001944 Py_XDECREF(args);
1945 Py_XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001946 return NULL;
1947}
1948
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001949static char reduce_doc[] =
1950"reduce(function, sequence[, initial]) -> value\n\
1951\n\
1952Apply a function of two arguments cumulatively to the items of a sequence,\n\
1953from left to right, so as to reduce the sequence to a single value.\n\
1954For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\
1955((((1+2)+3)+4)+5). If initial is present, it is placed before the items\n\
1956of the sequence in the calculation, and serves as a default when the\n\
1957sequence is empty.";
1958
1959
Guido van Rossum79f25d91997-04-29 20:08:16 +00001960static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001961builtin_reload(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001962 PyObject *self;
1963 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001964{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001965 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001966
Guido van Rossum79f25d91997-04-29 20:08:16 +00001967 if (!PyArg_ParseTuple(args, "O:reload", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001968 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001969 return PyImport_ReloadModule(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001970}
1971
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001972static char reload_doc[] =
1973"reload(module) -> module\n\
1974\n\
1975Reload the module. The module must have been successfully imported before.";
1976
1977
Guido van Rossum79f25d91997-04-29 20:08:16 +00001978static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001979builtin_repr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001980 PyObject *self;
1981 PyObject *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001982{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001983 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001984
Guido van Rossum79f25d91997-04-29 20:08:16 +00001985 if (!PyArg_ParseTuple(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001986 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001987 return PyObject_Repr(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001988}
1989
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001990static char repr_doc[] =
1991"repr(object) -> string\n\
1992\n\
1993Return the canonical string representation of the object.\n\
1994For most object types, eval(repr(object)) == object.";
1995
1996
Guido van Rossum79f25d91997-04-29 20:08:16 +00001997static PyObject *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001998builtin_round(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001999 PyObject *self;
2000 PyObject *args;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00002001{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00002002 double x;
2003 double f;
2004 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00002005 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002006
Guido van Rossum79f25d91997-04-29 20:08:16 +00002007 if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00002008 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00002009 f = 1.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00002010 i = abs(ndigits);
2011 while (--i >= 0)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00002012 f = f*10.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00002013 if (ndigits < 0)
2014 x /= f;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00002015 else
Guido van Rossum1e162d31998-05-09 14:42:25 +00002016 x *= f;
2017 if (x >= 0.0)
2018 x = floor(x + 0.5);
2019 else
2020 x = ceil(x - 0.5);
2021 if (ndigits < 0)
2022 x *= f;
2023 else
2024 x /= f;
2025 return PyFloat_FromDouble(x);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00002026}
2027
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002028static char round_doc[] =
2029"round(number[, ndigits]) -> floating point number\n\
2030\n\
2031Round a number to a given precision in decimal digits (default 0 digits).\n\
2032This always returns a floating point number. Precision may be negative.";
2033
2034
Guido van Rossum79f25d91997-04-29 20:08:16 +00002035static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002036builtin_str(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002037 PyObject *self;
2038 PyObject *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00002039{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002040 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002041
Guido van Rossum79f25d91997-04-29 20:08:16 +00002042 if (!PyArg_ParseTuple(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00002043 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002044 return PyObject_Str(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002045}
2046
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002047static char str_doc[] =
2048"str(object) -> string\n\
2049\n\
2050Return a nice string representation of the object.\n\
2051If the argument is a string, the return value is the same object.";
2052
2053
Guido van Rossum79f25d91997-04-29 20:08:16 +00002054static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002055builtin_tuple(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002056 PyObject *self;
2057 PyObject *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00002058{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002059 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002060
Guido van Rossum79f25d91997-04-29 20:08:16 +00002061 if (!PyArg_ParseTuple(args, "O:tuple", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002062 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00002063 return PySequence_Tuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00002064}
2065
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002066static char tuple_doc[] =
2067"tuple(sequence) -> list\n\
2068\n\
2069Return a tuple whose items are the same as those of the argument sequence.\n\
2070If the argument is a tuple, the return value is the same object.";
2071
2072
Guido van Rossum79f25d91997-04-29 20:08:16 +00002073static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002074builtin_type(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002075 PyObject *self;
2076 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002077{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002078 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002079
Guido van Rossum79f25d91997-04-29 20:08:16 +00002080 if (!PyArg_ParseTuple(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002081 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002082 v = (PyObject *)v->ob_type;
2083 Py_INCREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002084 return v;
2085}
2086
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002087static char type_doc[] =
2088"type(object) -> type object\n\
2089\n\
2090Return the type of the object.";
2091
2092
Guido van Rossum79f25d91997-04-29 20:08:16 +00002093static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002094builtin_vars(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002095 PyObject *self;
2096 PyObject *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00002097{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002098 PyObject *v = NULL;
2099 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002100
Guido van Rossum79f25d91997-04-29 20:08:16 +00002101 if (!PyArg_ParseTuple(args, "|O:vars", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002102 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00002103 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002104 d = PyEval_GetLocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00002105 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002106 if (!PyErr_Occurred())
2107 PyErr_SetString(PyExc_SystemError,
2108 "no locals!?");
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00002109 }
2110 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002111 Py_INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00002112 }
2113 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002114 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum2d951851994-08-29 12:52:16 +00002115 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002116 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00002117 "vars() argument must have __dict__ attribute");
2118 return NULL;
2119 }
2120 }
2121 return d;
2122}
2123
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002124static char vars_doc[] =
2125"vars([object]) -> dictionary\n\
2126\n\
2127Without arguments, equivalent to locals().\n\
2128With an argument, equivalent to object.__dict__.";
2129
Guido van Rossum668213d1999-06-16 17:28:37 +00002130static int
2131abstract_issubclass(derived, cls, err, first)
2132 PyObject *derived;
2133 PyObject *cls;
2134 char *err;
2135 int first;
2136{
2137 static PyObject *__bases__ = NULL;
2138 PyObject *bases;
Guido van Rossum7f851861999-06-17 19:12:39 +00002139 int i, n;
Guido van Rossum668213d1999-06-16 17:28:37 +00002140 int r = 0;
2141
2142 if (__bases__ == NULL) {
2143 __bases__ = PyString_FromString("__bases__");
2144 if (__bases__ == NULL)
2145 return -1;
2146 }
2147
2148 if (first) {
2149 bases = PyObject_GetAttr(cls, __bases__);
2150 if (bases == NULL || !PyTuple_Check(bases)) {
2151 Py_XDECREF(bases);
2152 PyErr_SetString(PyExc_TypeError, err);
2153 return -1;
2154 }
2155 Py_DECREF(bases);
2156 }
2157
2158 if (derived == cls)
2159 return 1;
2160
2161 bases = PyObject_GetAttr(derived, __bases__);
2162 if (bases == NULL || !PyTuple_Check(bases)) {
2163 Py_XDECREF(bases);
2164 PyErr_SetString(PyExc_TypeError, err);
2165 return -1;
2166 }
2167
2168 n = PyTuple_GET_SIZE(bases);
2169 for (i = 0; i < n; i++) {
2170 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i),
2171 cls, err, 0);
2172 if (r != 0)
2173 break;
2174 }
2175
2176 Py_DECREF(bases);
2177
2178 return r;
2179}
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002180
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002181static PyObject *
2182builtin_isinstance(self, args)
2183 PyObject *self;
2184 PyObject *args;
2185{
2186 PyObject *inst;
2187 PyObject *cls;
Guido van Rossum668213d1999-06-16 17:28:37 +00002188 PyObject *icls;
2189 static PyObject *__class__ = NULL;
2190 int retval = 0;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002191
Guido van Rossum43713e52000-02-29 13:59:29 +00002192 if (!PyArg_ParseTuple(args, "OO:isinstance", &inst, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002193 return NULL;
Guido van Rossumf5dd9141997-12-02 19:11:45 +00002194
Guido van Rossum668213d1999-06-16 17:28:37 +00002195 if (PyClass_Check(cls)) {
2196 if (PyInstance_Check(inst)) {
Guido van Rossumf5dd9141997-12-02 19:11:45 +00002197 PyObject *inclass =
2198 (PyObject*)((PyInstanceObject*)inst)->in_class;
2199 retval = PyClass_IsSubclass(inclass, cls);
2200 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002201 }
Guido van Rossum668213d1999-06-16 17:28:37 +00002202 else if (PyType_Check(cls)) {
2203 retval = ((PyObject *)(inst->ob_type) == cls);
2204 }
2205 else if (!PyInstance_Check(inst)) {
2206 if (__class__ == NULL) {
2207 __class__ = PyString_FromString("__class__");
2208 if (__class__ == NULL)
2209 return NULL;
2210 }
2211 icls = PyObject_GetAttr(inst, __class__);
2212 if (icls != NULL) {
2213 retval = abstract_issubclass(
2214 icls, cls,
2215 "second argument must be a class",
2216 1);
2217 Py_DECREF(icls);
2218 if (retval < 0)
2219 return NULL;
2220 }
2221 else {
2222 PyErr_SetString(PyExc_TypeError,
2223 "second argument must be a class");
2224 return NULL;
2225 }
2226 }
2227 else {
2228 PyErr_SetString(PyExc_TypeError,
2229 "second argument must be a class");
2230 return NULL;
2231 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002232 return PyInt_FromLong(retval);
2233}
2234
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002235static char isinstance_doc[] =
2236"isinstance(object, class-or-type) -> Boolean\n\
2237\n\
2238Return whether an object is an instance of a class or of a subclass thereof.\n\
2239With a type as second argument, return whether that is the object's type.";
2240
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002241
2242static PyObject *
2243builtin_issubclass(self, args)
2244 PyObject *self;
2245 PyObject *args;
2246{
2247 PyObject *derived;
2248 PyObject *cls;
2249 int retval;
2250
Guido van Rossum43713e52000-02-29 13:59:29 +00002251 if (!PyArg_ParseTuple(args, "OO:issubclass", &derived, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002252 return NULL;
Guido van Rossum668213d1999-06-16 17:28:37 +00002253
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002254 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossum668213d1999-06-16 17:28:37 +00002255 retval = abstract_issubclass(
2256 derived, cls, "arguments must be classes", 1);
2257 if (retval < 0)
2258 return NULL;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002259 }
Guido van Rossum668213d1999-06-16 17:28:37 +00002260 else {
2261 /* shortcut */
2262 if (!(retval = (derived == cls)))
2263 retval = PyClass_IsSubclass(derived, cls);
2264 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002265
2266 return PyInt_FromLong(retval);
2267}
2268
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002269static char issubclass_doc[] =
2270"issubclass(C, B) -> Boolean\n\
2271\n\
2272Return whether class C is a subclass (i.e., a derived class) of class B.";
2273
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002274
Guido van Rossum79f25d91997-04-29 20:08:16 +00002275static PyMethodDef builtin_methods[] = {
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002276 {"__import__", builtin___import__, 1, import_doc},
2277 {"abs", builtin_abs, 1, abs_doc},
2278 {"apply", builtin_apply, 1, apply_doc},
Guido van Rossum0daf0221999-03-19 19:07:19 +00002279 {"buffer", builtin_buffer, 1, buffer_doc},
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002280 {"callable", builtin_callable, 1, callable_doc},
2281 {"chr", builtin_chr, 1, chr_doc},
2282 {"cmp", builtin_cmp, 1, cmp_doc},
2283 {"coerce", builtin_coerce, 1, coerce_doc},
2284 {"compile", builtin_compile, 1, compile_doc},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00002285#ifndef WITHOUT_COMPLEX
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002286 {"complex", builtin_complex, 1, complex_doc},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00002287#endif
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002288 {"delattr", builtin_delattr, 1, delattr_doc},
2289 {"dir", builtin_dir, 1, dir_doc},
2290 {"divmod", builtin_divmod, 1, divmod_doc},
2291 {"eval", builtin_eval, 1, eval_doc},
2292 {"execfile", builtin_execfile, 1, execfile_doc},
2293 {"filter", builtin_filter, 1, filter_doc},
2294 {"float", builtin_float, 1, float_doc},
2295 {"getattr", builtin_getattr, 1, getattr_doc},
2296 {"globals", builtin_globals, 1, globals_doc},
2297 {"hasattr", builtin_hasattr, 1, hasattr_doc},
2298 {"hash", builtin_hash, 1, hash_doc},
2299 {"hex", builtin_hex, 1, hex_doc},
2300 {"id", builtin_id, 1, id_doc},
2301 {"input", builtin_input, 1, input_doc},
2302 {"intern", builtin_intern, 1, intern_doc},
2303 {"int", builtin_int, 1, int_doc},
2304 {"isinstance", builtin_isinstance, 1, isinstance_doc},
2305 {"issubclass", builtin_issubclass, 1, issubclass_doc},
2306 {"len", builtin_len, 1, len_doc},
2307 {"list", builtin_list, 1, list_doc},
2308 {"locals", builtin_locals, 1, locals_doc},
2309 {"long", builtin_long, 1, long_doc},
2310 {"map", builtin_map, 1, map_doc},
2311 {"max", builtin_max, 1, max_doc},
2312 {"min", builtin_min, 1, min_doc},
2313 {"oct", builtin_oct, 1, oct_doc},
2314 {"open", builtin_open, 1, open_doc},
2315 {"ord", builtin_ord, 1, ord_doc},
2316 {"pow", builtin_pow, 1, pow_doc},
2317 {"range", builtin_range, 1, range_doc},
2318 {"raw_input", builtin_raw_input, 1, raw_input_doc},
2319 {"reduce", builtin_reduce, 1, reduce_doc},
2320 {"reload", builtin_reload, 1, reload_doc},
2321 {"repr", builtin_repr, 1, repr_doc},
2322 {"round", builtin_round, 1, round_doc},
2323 {"setattr", builtin_setattr, 1, setattr_doc},
2324 {"slice", builtin_slice, 1, slice_doc},
2325 {"str", builtin_str, 1, str_doc},
2326 {"tuple", builtin_tuple, 1, tuple_doc},
2327 {"type", builtin_type, 1, type_doc},
Guido van Rossum09095f32000-03-10 23:00:52 +00002328 {"unicode", builtin_unicode, 1, unicode_doc},
2329 {"unichr", builtin_unichr, 1, unichr_doc},
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002330 {"vars", builtin_vars, 1, vars_doc},
2331 {"xrange", builtin_xrange, 1, xrange_doc},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00002332 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00002333};
2334
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002335static char builtin_doc[] =
2336"Built-in functions, exceptions, and other objects.\n\
2337\n\
2338Noteworthy: None is the `nil' object; Ellipsis represents `...' in slices.";
2339
Guido van Rossum25ce5661997-08-02 03:10:38 +00002340PyObject *
Barry Warsaw78e6c672000-05-25 23:15:05 +00002341_PyBuiltin_Init()
Guido van Rossum25ce5661997-08-02 03:10:38 +00002342{
Fred Drake5550de32000-06-20 04:54:19 +00002343 PyObject *mod, *dict, *debug;
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002344 mod = Py_InitModule4("__builtin__", builtin_methods,
2345 builtin_doc, (PyObject *)NULL,
2346 PYTHON_API_VERSION);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002347 if (mod == NULL)
2348 return NULL;
2349 dict = PyModule_GetDict(mod);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002350 if (PyDict_SetItemString(dict, "None", Py_None) < 0)
2351 return NULL;
2352 if (PyDict_SetItemString(dict, "Ellipsis", Py_Ellipsis) < 0)
2353 return NULL;
Fred Drake5550de32000-06-20 04:54:19 +00002354 debug = PyInt_FromLong(Py_OptimizeFlag == 0);
2355 if (PyDict_SetItemString(dict, "__debug__", debug) < 0) {
2356 Py_XDECREF(debug);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002357 return NULL;
Fred Drake5550de32000-06-20 04:54:19 +00002358 }
2359 Py_XDECREF(debug);
Barry Warsaw757af0e1997-08-29 22:13:51 +00002360
Guido van Rossum25ce5661997-08-02 03:10:38 +00002361 return mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002362}
2363
Guido van Rossume77a7571993-11-03 15:01:26 +00002364/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00002365
Guido van Rossum79f25d91997-04-29 20:08:16 +00002366static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00002367filtertuple(func, tuple)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002368 PyObject *func;
2369 PyObject *tuple;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002370{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002371 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002372 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002373 int len = PyTuple_Size(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002374
Guido van Rossumb7b45621995-08-04 04:07:45 +00002375 if (len == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002376 Py_INCREF(tuple);
Guido van Rossumb7b45621995-08-04 04:07:45 +00002377 return tuple;
2378 }
2379
Guido van Rossum79f25d91997-04-29 20:08:16 +00002380 if ((result = PyTuple_New(len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00002381 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002382
Guido van Rossum12d12c51993-10-26 17:58:25 +00002383 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002384 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002385 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002386
Guido van Rossum79f25d91997-04-29 20:08:16 +00002387 if ((item = PyTuple_GetItem(tuple, i)) == NULL)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002388 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002389 if (func == Py_None) {
2390 Py_INCREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002391 good = item;
2392 }
2393 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002394 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002395 if (arg == NULL)
2396 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002397 good = PyEval_CallObject(func, arg);
2398 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002399 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002400 goto Fail_1;
2401 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002402 ok = PyObject_IsTrue(good);
2403 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002404 if (ok) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002405 Py_INCREF(item);
2406 if (PyTuple_SetItem(result, j++, item) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002407 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002408 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00002409 }
2410
Guido van Rossum79f25d91997-04-29 20:08:16 +00002411 if (_PyTuple_Resize(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002412 return NULL;
2413
Guido van Rossum12d12c51993-10-26 17:58:25 +00002414 return result;
2415
Guido van Rossum12d12c51993-10-26 17:58:25 +00002416Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002417 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002418 return NULL;
2419}
2420
2421
Guido van Rossume77a7571993-11-03 15:01:26 +00002422/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00002423
Guido van Rossum79f25d91997-04-29 20:08:16 +00002424static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00002425filterstring(func, strobj)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002426 PyObject *func;
2427 PyObject *strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002428{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002429 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002430 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002431 int len = PyString_Size(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002432
Guido van Rossum79f25d91997-04-29 20:08:16 +00002433 if (func == Py_None) {
Guido van Rossum2586bf01993-11-01 16:21:44 +00002434 /* No character is ever false -- share input string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002435 Py_INCREF(strobj);
Guido van Rossum2d951851994-08-29 12:52:16 +00002436 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002437 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002438 if ((result = PyString_FromStringAndSize(NULL, len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00002439 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002440
Guido van Rossum12d12c51993-10-26 17:58:25 +00002441 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002442 PyObject *item, *arg, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002443 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002444
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002445 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
2446 if (item == NULL)
2447 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002448 arg = Py_BuildValue("(O)", item);
2449 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002450 if (arg == NULL)
2451 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002452 good = PyEval_CallObject(func, arg);
2453 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002454 if (good == NULL)
2455 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002456 ok = PyObject_IsTrue(good);
2457 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002458 if (ok)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002459 PyString_AS_STRING((PyStringObject *)result)[j++] =
2460 PyString_AS_STRING((PyStringObject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00002461 }
2462
Guido van Rossum79f25d91997-04-29 20:08:16 +00002463 if (j < len && _PyString_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002464 return NULL;
2465
Guido van Rossum12d12c51993-10-26 17:58:25 +00002466 return result;
2467
Guido van Rossum12d12c51993-10-26 17:58:25 +00002468Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002469 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002470 return NULL;
2471}