1c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Built-in functions */ 2c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 3c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "Python.h" 4c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "Python-ast.h" 5c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 6c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "node.h" 7c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "code.h" 8c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "eval.h" 9c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 10c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <ctype.h> 11c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <float.h> /* for DBL_MANT_DIG and friends */ 12c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 13c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef RISCOS 14c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "unixstuff.h" 15c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 16c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 17c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* The default encoding used by the platform file system APIs 18c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Can remain NULL for all platforms that don't have such a concept 19c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel*/ 20c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T) 21c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielconst char *Py_FileSystemDefaultEncoding = "mbcs"; 22c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#elif defined(__APPLE__) 23c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielconst char *Py_FileSystemDefaultEncoding = "utf-8"; 24c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else 25c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielconst char *Py_FileSystemDefaultEncoding = NULL; /* use default */ 26c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 27c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 28c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Forward */ 29c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *filterstring(PyObject *, PyObject *); 30c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE 31c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *filterunicode(PyObject *, PyObject *); 32c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 33c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *filtertuple (PyObject *, PyObject *); 34c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 35c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 36c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin___import__(PyObject *self, PyObject *args, PyObject *kwds) 37c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 38c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel static char *kwlist[] = {"name", "globals", "locals", "fromlist", 39c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "level", 0}; 40c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char *name; 41c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *globals = NULL; 42c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *locals = NULL; 43c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *fromlist = NULL; 44c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int level = -1; 45c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 46c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|OOOi:__import__", 47c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel kwlist, &name, &globals, &locals, &fromlist, &level)) 48c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 49c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyImport_ImportModuleLevel(name, globals, locals, 50c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel fromlist, level); 51c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 52c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 53c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(import_doc, 54c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"__import__(name, globals={}, locals={}, fromlist=[], level=-1) -> module\n\ 55c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 56c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielImport a module. Because this function is meant for use by the Python\n\ 57c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielinterpreter and not for general use it is better to use\n\ 58c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielimportlib.import_module() to programmatically import a module.\n\ 59c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 60c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielThe globals argument is only used to determine the context;\n\ 61c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielthey are not modified. The locals argument is unused. The fromlist\n\ 62c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielshould be a list of names to emulate ``from name import ...'', or an\n\ 63c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielempty list to emulate ``import name''.\n\ 64c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielWhen importing a module from a package, note that __import__('A.B', ...)\n\ 65c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielreturns package A when fromlist is empty, but its submodule B when\n\ 66c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielfromlist is not empty. Level is used to determine whether to perform \n\ 67c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielabsolute or relative imports. -1 is the original strategy of attempting\n\ 68c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielboth absolute and relative imports, 0 is absolute, a positive number\n\ 69c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielis the number of parent directories to search relative to the current module."); 70c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 71c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 72c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 73c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_abs(PyObject *self, PyObject *v) 74c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 75c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyNumber_Absolute(v); 76c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 77c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 78c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(abs_doc, 79c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"abs(number) -> number\n\ 80c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 81c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the absolute value of the argument."); 82c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 83c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 84c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_all(PyObject *self, PyObject *v) 85c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 86c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *it, *item; 87c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *(*iternext)(PyObject *); 88c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int cmp; 89c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 90c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel it = PyObject_GetIter(v); 91c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (it == NULL) 92c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 93c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel iternext = *Py_TYPE(it)->tp_iternext; 94c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 95c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel for (;;) { 96c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel item = iternext(it); 97c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (item == NULL) 98c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel break; 99c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel cmp = PyObject_IsTrue(item); 100c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 101c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (cmp < 0) { 102c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(it); 103c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 104c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 105c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (cmp == 0) { 106c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(it); 107c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_RETURN_FALSE; 108c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 109c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 110c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(it); 111c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyErr_Occurred()) { 112c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyErr_ExceptionMatches(PyExc_StopIteration)) 113c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Clear(); 114c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else 115c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 116c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 117c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_RETURN_TRUE; 118c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 119c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 120c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(all_doc, 121c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"all(iterable) -> bool\n\ 122c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 123c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn True if bool(x) is True for all values x in the iterable.\n\ 124c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielIf the iterable is empty, return True."); 125c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 126c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 127c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_any(PyObject *self, PyObject *v) 128c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 129c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *it, *item; 130c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *(*iternext)(PyObject *); 131c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int cmp; 132c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 133c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel it = PyObject_GetIter(v); 134c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (it == NULL) 135c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 136c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel iternext = *Py_TYPE(it)->tp_iternext; 137c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 138c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel for (;;) { 139c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel item = iternext(it); 140c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (item == NULL) 141c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel break; 142c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel cmp = PyObject_IsTrue(item); 143c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 144c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (cmp < 0) { 145c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(it); 146c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 147c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 148c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (cmp == 1) { 149c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(it); 150c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_RETURN_TRUE; 151c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 152c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 153c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(it); 154c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyErr_Occurred()) { 155c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyErr_ExceptionMatches(PyExc_StopIteration)) 156c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Clear(); 157c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else 158c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 159c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 160c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_RETURN_FALSE; 161c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 162c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 163c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(any_doc, 164c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"any(iterable) -> bool\n\ 165c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 166c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn True if bool(x) is True for any x in the iterable.\n\ 167c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielIf the iterable is empty, return False."); 168c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 169c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 170c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_apply(PyObject *self, PyObject *args) 171c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 172c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *func, *alist = NULL, *kwdict = NULL; 173c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *t = NULL, *retval = NULL; 174c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 175c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyErr_WarnPy3k("apply() not supported in 3.x; " 176c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "use func(*args, **kwargs)", 1) < 0) 177c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 178c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 179c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_UnpackTuple(args, "apply", 1, 3, &func, &alist, &kwdict)) 180c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 181c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (alist != NULL) { 182c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyTuple_Check(alist)) { 183c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PySequence_Check(alist)) { 184c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Format(PyExc_TypeError, 185c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "apply() arg 2 expected sequence, found %s", 186c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel alist->ob_type->tp_name); 187c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 188c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 189c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel t = PySequence_Tuple(alist); 190c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (t == NULL) 191c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 192c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel alist = t; 193c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 194c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 195c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (kwdict != NULL && !PyDict_Check(kwdict)) { 196c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Format(PyExc_TypeError, 197c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "apply() arg 3 expected dictionary, found %s", 198c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel kwdict->ob_type->tp_name); 199c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto finally; 200c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 201c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel retval = PyEval_CallObjectWithKeywords(func, alist, kwdict); 202c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel finally: 203c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(t); 204c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return retval; 205c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 206c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 207c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(apply_doc, 208c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"apply(object[, args[, kwargs]]) -> value\n\ 209c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 210c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielCall a callable object with positional arguments taken from the tuple args,\n\ 211c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieland keyword arguments taken from the optional dictionary kwargs.\n\ 212c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielNote that classes are callable, as are instances with a __call__() method.\n\ 213c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 214c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielDeprecated since release 2.3. Instead, use the extended call syntax:\n\ 215c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel function(*args, **keywords)."); 216c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 217c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 218c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 219c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_bin(PyObject *self, PyObject *v) 220c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 221c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyNumber_ToBase(v, 2); 222c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 223c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 224c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(bin_doc, 225c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"bin(number) -> string\n\ 226c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 227c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the binary representation of an integer or long integer."); 228c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 229c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 230c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 231c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_callable(PyObject *self, PyObject *v) 232c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 233c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyBool_FromLong((long)PyCallable_Check(v)); 234c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 235c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 236c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(callable_doc, 237c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"callable(object) -> bool\n\ 238c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 239c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn whether the object is callable (i.e., some kind of function).\n\ 240c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielNote that classes are callable, as are instances with a __call__() method."); 241c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 242c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 243c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 244c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_filter(PyObject *self, PyObject *args) 245c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 246c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *func, *seq, *result, *it, *arg; 247c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_ssize_t len; /* guess for result list size */ 248c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel register Py_ssize_t j; 249c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 250c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_UnpackTuple(args, "filter", 2, 2, &func, &seq)) 251c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 252c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 253c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Strings and tuples return a result of the same type. */ 254c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyString_Check(seq)) 255c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return filterstring(func, seq); 256c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE 257c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyUnicode_Check(seq)) 258c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return filterunicode(func, seq); 259c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 260c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyTuple_Check(seq)) 261c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return filtertuple(func, seq); 262c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 263c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Pre-allocate argument list tuple. */ 264c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel arg = PyTuple_New(1); 265c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (arg == NULL) 266c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 267c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 268c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Get iterator. */ 269c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel it = PyObject_GetIter(seq); 270c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (it == NULL) 271c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_arg; 272c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 273c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Guess a result list size. */ 274c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel len = _PyObject_LengthHint(seq, 8); 275c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (len == -1) 276c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_it; 277c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 278c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Get a result list. */ 279c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyList_Check(seq) && seq->ob_refcnt == 1) { 280c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Eww - can modify the list in-place. */ 281c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(seq); 282c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel result = seq; 283c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 284c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 285c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel result = PyList_New(len); 286c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (result == NULL) 287c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_it; 288c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 289c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 290c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Build the result list. */ 291c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel j = 0; 292c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel for (;;) { 293c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *item; 294c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int ok; 295c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 296c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel item = PyIter_Next(it); 297c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (item == NULL) { 298c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyErr_Occurred()) 299c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_result_it; 300c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel break; 301c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 302c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 303c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (func == (PyObject *)&PyBool_Type || func == Py_None) { 304c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ok = PyObject_IsTrue(item); 305c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 306c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 307c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *good; 308c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyTuple_SET_ITEM(arg, 0, item); 309c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel good = PyObject_Call(func, arg, NULL); 310c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyTuple_SET_ITEM(arg, 0, NULL); 311c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (good == NULL) { 312c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 313c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_result_it; 314c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 315c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ok = PyObject_IsTrue(good); 316c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(good); 317c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 318c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (ok > 0) { 319c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (j < len) 320c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyList_SET_ITEM(result, j, item); 321c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 322c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int status = PyList_Append(result, item); 323c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 324c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (status < 0) 325c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_result_it; 326c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 327c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ++j; 328c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 329c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 330c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 331c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (ok < 0) 332c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_result_it; 333c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 334c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 335c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 336c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 337c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Cut back result list if len is too big. */ 338c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (j < len && PyList_SetSlice(result, j, len, NULL) < 0) 339c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_result_it; 340c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 341c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(it); 342c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(arg); 343c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return result; 344c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 345c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFail_result_it: 346c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(result); 347c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFail_it: 348c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(it); 349c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFail_arg: 350c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(arg); 351c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 352c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 353c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 354c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(filter_doc, 355c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"filter(function or None, sequence) -> list, tuple, or string\n" 356c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"\n" 357c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"Return those items of sequence for which function(item) is true. If\n" 358c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"function is None, return the items that are true. If sequence is a tuple\n" 359c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"or string, return the same type, else return a list."); 360c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 361c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 362c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_format(PyObject *self, PyObject *args) 363c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 364c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *value; 365c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *format_spec = NULL; 366c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 367c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_ParseTuple(args, "O|O:format", &value, &format_spec)) 368c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 369c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 370c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyObject_Format(value, format_spec); 371c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 372c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 373c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(format_doc, 374c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"format(value[, format_spec]) -> string\n\ 375c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 376c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturns value.__format__(format_spec)\n\ 377c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielformat_spec defaults to \"\""); 378c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 379c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 380c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_chr(PyObject *self, PyObject *args) 381c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 382c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel long x; 383c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char s[1]; 384c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 385c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_ParseTuple(args, "l:chr", &x)) 386c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 387c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (x < 0 || x >= 256) { 388c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_ValueError, 389c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "chr() arg not in range(256)"); 390c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 391c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 392c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel s[0] = (char)x; 393c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyString_FromStringAndSize(s, 1); 394c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 395c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 396c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(chr_doc, 397c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"chr(i) -> character\n\ 398c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 399c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn a string of one character with ordinal i; 0 <= i < 256."); 400c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 401c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 402c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE 403c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 404c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_unichr(PyObject *self, PyObject *args) 405c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 406c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int x; 407c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 408c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_ParseTuple(args, "i:unichr", &x)) 409c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 410c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 411c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyUnicode_FromOrdinal(x); 412c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 413c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 414c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(unichr_doc, 415c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"unichr(i) -> Unicode character\n\ 416c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 417c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff."); 418c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 419c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 420c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 421c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 422c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_cmp(PyObject *self, PyObject *args) 423c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 424c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *a, *b; 425c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int c; 426c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 427c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_UnpackTuple(args, "cmp", 2, 2, &a, &b)) 428c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 429c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyObject_Cmp(a, b, &c) < 0) 430c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 431c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyInt_FromLong((long)c); 432c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 433c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 434c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(cmp_doc, 435c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"cmp(x, y) -> integer\n\ 436c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 437c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn negative if x<y, zero if x==y, positive if x>y."); 438c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 439c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 440c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 441c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_coerce(PyObject *self, PyObject *args) 442c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 443c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *v, *w; 444c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *res; 445c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 446c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyErr_WarnPy3k("coerce() not supported in 3.x", 1) < 0) 447c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 448c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 449c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_UnpackTuple(args, "coerce", 2, 2, &v, &w)) 450c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 451c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyNumber_Coerce(&v, &w) < 0) 452c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 453c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel res = PyTuple_Pack(2, v, w); 454c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(v); 455c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(w); 456c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return res; 457c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 458c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 459c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(coerce_doc, 460c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"coerce(x, y) -> (x1, y1)\n\ 461c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 462c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn a tuple consisting of the two numeric arguments converted to\n\ 463c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniela common type, using the same rules as used by arithmetic operations.\n\ 464c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielIf coercion is not possible, raise TypeError."); 465c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 466c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 467c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_compile(PyObject *self, PyObject *args, PyObject *kwds) 468c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 469c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char *str; 470c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char *filename; 471c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char *startstr; 472c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int mode = -1; 473c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int dont_inherit = 0; 474c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int supplied_flags = 0; 475c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int is_ast; 476c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyCompilerFlags cf; 477c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *result = NULL, *cmd, *tmp = NULL; 478c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_ssize_t length; 479c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel static char *kwlist[] = {"source", "filename", "mode", "flags", 480c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "dont_inherit", NULL}; 481c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int start[] = {Py_file_input, Py_eval_input, Py_single_input}; 482c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 483c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_ParseTupleAndKeywords(args, kwds, "Oss|ii:compile", 484c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel kwlist, &cmd, &filename, &startstr, 485c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel &supplied_flags, &dont_inherit)) 486c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 487c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 488c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel cf.cf_flags = supplied_flags; 489c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 490c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (supplied_flags & 491c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ~(PyCF_MASK | PyCF_MASK_OBSOLETE | PyCF_DONT_IMPLY_DEDENT | PyCF_ONLY_AST)) 492c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel { 493c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_ValueError, 494c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "compile(): unrecognised flags"); 495c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 496c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 497c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* XXX Warn if (supplied_flags & PyCF_MASK_OBSOLETE) != 0? */ 498c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 499c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!dont_inherit) { 500c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyEval_MergeCompilerFlags(&cf); 501c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 502c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 503c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (strcmp(startstr, "exec") == 0) 504c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel mode = 0; 505c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else if (strcmp(startstr, "eval") == 0) 506c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel mode = 1; 507c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else if (strcmp(startstr, "single") == 0) 508c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel mode = 2; 509c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 510c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_ValueError, 511c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "compile() arg 3 must be 'exec', 'eval' or 'single'"); 512c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 513c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 514c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 515c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel is_ast = PyAST_Check(cmd); 516c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (is_ast == -1) 517c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 518c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (is_ast) { 519c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (supplied_flags & PyCF_ONLY_AST) { 520c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(cmd); 521c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel result = cmd; 522c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 523c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 524c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyArena *arena; 525c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel mod_ty mod; 526c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 527c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel arena = PyArena_New(); 528c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (arena == NULL) 529c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 530c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel mod = PyAST_obj2mod(cmd, arena, mode); 531c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (mod == NULL) { 532c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyArena_Free(arena); 533c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 534c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 535c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel result = (PyObject*)PyAST_Compile(mod, filename, 536c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel &cf, arena); 537c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyArena_Free(arena); 538c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 539c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return result; 540c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 541c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 542c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE 543c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyUnicode_Check(cmd)) { 544c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel tmp = PyUnicode_AsUTF8String(cmd); 545c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (tmp == NULL) 546c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 547c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel cmd = tmp; 548c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel cf.cf_flags |= PyCF_SOURCE_IS_UTF8; 549c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 550c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 551c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 552c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyObject_AsReadBuffer(cmd, (const void **)&str, &length)) 553c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto cleanup; 554c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if ((size_t)length != strlen(str)) { 555c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_TypeError, 556c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "compile() expected string without null bytes"); 557c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto cleanup; 558c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 559c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel result = Py_CompileStringFlags(str, filename, start[mode], &cf); 560c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielcleanup: 561c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(tmp); 562c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return result; 563c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 564c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 565c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(compile_doc, 566c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"compile(source, filename, mode[, flags[, dont_inherit]]) -> code object\n\ 567c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 568c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielCompile the source string (a Python module, statement or expression)\n\ 569c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielinto a code object that can be executed by the exec statement or eval().\n\ 570c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielThe filename will be used for run-time error messages.\n\ 571c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielThe mode must be 'exec' to compile a module, 'single' to compile a\n\ 572c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsingle (interactive) statement, or 'eval' to compile an expression.\n\ 573c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielThe flags argument, if present, controls which future statements influence\n\ 574c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielthe compilation of the code.\n\ 575c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielThe dont_inherit argument, if non-zero, stops the compilation inheriting\n\ 576c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielthe effects of any future statements in effect in the code calling\n\ 577c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielcompile; if absent or zero these statements do influence the compilation,\n\ 578c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielin addition to any features explicitly specified."); 579c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 580c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 581c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_dir(PyObject *self, PyObject *args) 582c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 583c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *arg = NULL; 584c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 585c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_UnpackTuple(args, "dir", 0, 1, &arg)) 586c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 587c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyObject_Dir(arg); 588c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 589c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 590c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(dir_doc, 591c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"dir([object]) -> list of strings\n" 592c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"\n" 593c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"If called without an argument, return the names in the current scope.\n" 594c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"Else, return an alphabetized list of names comprising (some of) the attributes\n" 595c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"of the given object, and of attributes reachable from it.\n" 596c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"If the object supplies a method named __dir__, it will be used; otherwise\n" 597c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"the default dir() logic is used and returns:\n" 598c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel" for a module object: the module's attributes.\n" 599c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel" for a class object: its attributes, and recursively the attributes\n" 600c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel" of its bases.\n" 601c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel" for any other object: its attributes, its class's attributes, and\n" 602c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel" recursively the attributes of its class's base classes."); 603c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 604c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 605c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_divmod(PyObject *self, PyObject *args) 606c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 607c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *v, *w; 608c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 609c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_UnpackTuple(args, "divmod", 2, 2, &v, &w)) 610c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 611c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyNumber_Divmod(v, w); 612c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 613c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 614c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(divmod_doc, 615c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"divmod(x, y) -> (quotient, remainder)\n\ 616c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 617c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the tuple ((x-x%y)/y, x%y). Invariant: div*y + mod == x."); 618c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 619c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 620c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 621c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_eval(PyObject *self, PyObject *args) 622c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 623c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *cmd, *result, *tmp = NULL; 624c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *globals = Py_None, *locals = Py_None; 625c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char *str; 626c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyCompilerFlags cf; 627c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 628c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_UnpackTuple(args, "eval", 1, 3, &cmd, &globals, &locals)) 629c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 630c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (locals != Py_None && !PyMapping_Check(locals)) { 631c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_TypeError, "locals must be a mapping"); 632c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 633c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 634c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (globals != Py_None && !PyDict_Check(globals)) { 635c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_TypeError, PyMapping_Check(globals) ? 636c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "globals must be a real dict; try eval(expr, {}, mapping)" 637c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel : "globals must be a dict"); 638c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 639c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 640c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (globals == Py_None) { 641c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel globals = PyEval_GetGlobals(); 642c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (locals == Py_None) 643c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel locals = PyEval_GetLocals(); 644c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 645c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else if (locals == Py_None) 646c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel locals = globals; 647c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 648c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (globals == NULL || locals == NULL) { 649c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_TypeError, 650c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "eval must be given globals and locals " 651c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "when called without a frame"); 652c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 653c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 654c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 655c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyDict_GetItemString(globals, "__builtins__") == NULL) { 656c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyDict_SetItemString(globals, "__builtins__", 657c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyEval_GetBuiltins()) != 0) 658c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 659c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 660c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 661c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyCode_Check(cmd)) { 662c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyCode_GetNumFree((PyCodeObject *)cmd) > 0) { 663c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_TypeError, 664c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "code object passed to eval() may not contain free variables"); 665c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 666c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 667c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals); 668c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 669c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 670c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyString_Check(cmd) && 671c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel !PyUnicode_Check(cmd)) { 672c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_TypeError, 673c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "eval() arg 1 must be a string or code object"); 674c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 675c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 676c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel cf.cf_flags = 0; 677c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 678c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE 679c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyUnicode_Check(cmd)) { 680c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel tmp = PyUnicode_AsUTF8String(cmd); 681c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (tmp == NULL) 682c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 683c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel cmd = tmp; 684c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel cf.cf_flags |= PyCF_SOURCE_IS_UTF8; 685c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 686c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 687c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyString_AsStringAndSize(cmd, &str, NULL)) { 688c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(tmp); 689c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 690c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 691c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel while (*str == ' ' || *str == '\t') 692c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel str++; 693c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 694c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel (void)PyEval_MergeCompilerFlags(&cf); 695c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel result = PyRun_StringFlags(str, Py_eval_input, globals, locals, &cf); 696c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(tmp); 697c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return result; 698c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 699c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 700c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(eval_doc, 701c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"eval(source[, globals[, locals]]) -> value\n\ 702c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 703c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielEvaluate the source in the context of globals and locals.\n\ 704c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielThe source may be a string representing a Python expression\n\ 705c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielor a code object as returned by compile().\n\ 706c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielThe globals must be a dictionary and locals can be any mapping,\n\ 707c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieldefaulting to the current globals and locals.\n\ 708c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielIf only globals is given, locals defaults to it.\n"); 709c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 710c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 711c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 712c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_execfile(PyObject *self, PyObject *args) 713c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 714c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char *filename; 715c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *globals = Py_None, *locals = Py_None; 716c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *res; 717c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel FILE* fp = NULL; 718c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyCompilerFlags cf; 719c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int exists; 720c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 721c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyErr_WarnPy3k("execfile() not supported in 3.x; use exec()", 722c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1) < 0) 723c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 724c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 725c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_ParseTuple(args, "s|O!O:execfile", 726c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel &filename, 727c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel &PyDict_Type, &globals, 728c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel &locals)) 729c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 730c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (locals != Py_None && !PyMapping_Check(locals)) { 731c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_TypeError, "locals must be a mapping"); 732c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 733c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 734c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (globals == Py_None) { 735c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel globals = PyEval_GetGlobals(); 736c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (locals == Py_None) 737c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel locals = PyEval_GetLocals(); 738c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 739c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else if (locals == Py_None) 740c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel locals = globals; 741c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyDict_GetItemString(globals, "__builtins__") == NULL) { 742c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyDict_SetItemString(globals, "__builtins__", 743c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyEval_GetBuiltins()) != 0) 744c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 745c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 746c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 747c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel exists = 0; 748c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Test for existence or directory. */ 749c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(PLAN9) 750c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel { 751c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Dir *d; 752c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 753c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if ((d = dirstat(filename))!=nil) { 754c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if(d->mode & DMDIR) 755c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel werrstr("is a directory"); 756c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else 757c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel exists = 1; 758c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel free(d); 759c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 760c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 761c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#elif defined(RISCOS) 762c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (object_exists(filename)) { 763c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (isdir(filename)) 764c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel errno = EISDIR; 765c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else 766c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel exists = 1; 767c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 768c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else /* standard Posix */ 769c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel { 770c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel struct stat s; 771c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (stat(filename, &s) == 0) { 772c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (S_ISDIR(s.st_mode)) 773c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# if defined(PYOS_OS2) && defined(PYCC_VACPP) 774c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel errno = EOS2ERR; 775c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# else 776c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel errno = EISDIR; 777c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# endif 778c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else 779c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel exists = 1; 780c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 781c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 782c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 783c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 784c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (exists) { 785c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_BEGIN_ALLOW_THREADS 786c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel fp = fopen(filename, "r" PY_STDIOTEXTMODE); 787c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_END_ALLOW_THREADS 788c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 789c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (fp == NULL) { 790c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel exists = 0; 791c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 792c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 793c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 794c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!exists) { 795c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetFromErrnoWithFilename(PyExc_IOError, filename); 796c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 797c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 798c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel cf.cf_flags = 0; 799c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyEval_MergeCompilerFlags(&cf)) 800c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel res = PyRun_FileExFlags(fp, filename, Py_file_input, globals, 801c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel locals, 1, &cf); 802c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else 803c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel res = PyRun_FileEx(fp, filename, Py_file_input, globals, 804c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel locals, 1); 805c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return res; 806c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 807c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 808c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(execfile_doc, 809c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"execfile(filename[, globals[, locals]])\n\ 810c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 811c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielRead and execute a Python script from a file.\n\ 812c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielThe globals and locals are dictionaries, defaulting to the current\n\ 813c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielglobals and locals. If only globals is given, locals defaults to it."); 814c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 815c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 816c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 817c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_getattr(PyObject *self, PyObject *args) 818c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 819c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *v, *result, *dflt = NULL; 820c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *name; 821c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 822c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_UnpackTuple(args, "getattr", 2, 3, &v, &name, &dflt)) 823c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 824c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE 825c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyUnicode_Check(name)) { 826c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel name = _PyUnicode_AsDefaultEncodedString(name, NULL); 827c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (name == NULL) 828c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 829c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 830c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 831c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 832c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyString_Check(name)) { 833c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_TypeError, 834c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "getattr(): attribute name must be string"); 835c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 836c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 837c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel result = PyObject_GetAttr(v, name); 838c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (result == NULL && dflt != NULL && 839c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_ExceptionMatches(PyExc_AttributeError)) 840c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel { 841c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Clear(); 842c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(dflt); 843c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel result = dflt; 844c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 845c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return result; 846c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 847c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 848c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(getattr_doc, 849c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"getattr(object, name[, default]) -> value\n\ 850c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 851c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielGet a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\n\ 852c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielWhen a default argument is given, it is returned when the attribute doesn't\n\ 853c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielexist; without it, an exception is raised in that case."); 854c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 855c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 856c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 857c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_globals(PyObject *self) 858c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 859c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *d; 860c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 861c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel d = PyEval_GetGlobals(); 862c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XINCREF(d); 863c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return d; 864c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 865c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 866c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(globals_doc, 867c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"globals() -> dictionary\n\ 868c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 869c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the dictionary containing the current scope's global variables."); 870c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 871c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 872c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 873c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_hasattr(PyObject *self, PyObject *args) 874c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 875c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *v; 876c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *name; 877c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 878c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_UnpackTuple(args, "hasattr", 2, 2, &v, &name)) 879c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 880c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE 881c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyUnicode_Check(name)) { 882c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel name = _PyUnicode_AsDefaultEncodedString(name, NULL); 883c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (name == NULL) 884c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 885c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 886c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 887c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 888c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyString_Check(name)) { 889c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_TypeError, 890c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "hasattr(): attribute name must be string"); 891c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 892c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 893c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel v = PyObject_GetAttr(v, name); 894c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (v == NULL) { 895c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyErr_ExceptionMatches(PyExc_Exception)) 896c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 897c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 898c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Clear(); 899c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(Py_False); 900c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return Py_False; 901c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 902c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 903c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(v); 904c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(Py_True); 905c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return Py_True; 906c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 907c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 908c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(hasattr_doc, 909c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"hasattr(object, name) -> bool\n\ 910c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 911c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn whether the object has an attribute with the given name.\n\ 912c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel(This is done by calling getattr(object, name) and catching exceptions.)"); 913c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 914c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 915c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 916c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_id(PyObject *self, PyObject *v) 917c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 918c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyLong_FromVoidPtr(v); 919c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 920c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 921c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(id_doc, 922c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"id(object) -> integer\n\ 923c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 924c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the identity of an object. This is guaranteed to be unique among\n\ 925c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsimultaneously existing objects. (Hint: it's the object's memory address.)"); 926c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 927c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 928c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 929c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_map(PyObject *self, PyObject *args) 930c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 931c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel typedef struct { 932c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *it; /* the iterator object */ 933c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int saw_StopIteration; /* bool: did the iterator end? */ 934c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } sequence; 935c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 936c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *func, *result; 937c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel sequence *seqs = NULL, *sqp; 938c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_ssize_t n, len; 939c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel register int i, j; 940c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 941c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel n = PyTuple_Size(args); 942c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (n < 2) { 943c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_TypeError, 944c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "map() requires at least two args"); 945c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 946c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 947c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 948c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel func = PyTuple_GetItem(args, 0); 949c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel n--; 950c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 951c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (func == Py_None) { 952c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyErr_WarnPy3k("map(None, ...) not supported in 3.x; " 953c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "use list(...)", 1) < 0) 954c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 955c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (n == 1) { 956c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* map(None, S) is the same as list(S). */ 957c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PySequence_List(PyTuple_GetItem(args, 1)); 958c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 959c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 960c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 961c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Get space for sequence descriptors. Must NULL out the iterator 962c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * pointers so that jumping to Fail_2 later doesn't see trash. 963c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 964c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if ((seqs = PyMem_NEW(sequence, n)) == NULL) { 965c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_NoMemory(); 966c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 967c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 968c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel for (i = 0; i < n; ++i) { 969c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel seqs[i].it = (PyObject*)NULL; 970c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel seqs[i].saw_StopIteration = 0; 971c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 972c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 973c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Do a first pass to obtain iterators for the arguments, and set len 974c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * to the largest of their lengths. 975c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 976c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel len = 0; 977c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel for (i = 0, sqp = seqs; i < n; ++i, ++sqp) { 978c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *curseq; 979c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_ssize_t curlen; 980c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 981c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Get iterator. */ 982c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel curseq = PyTuple_GetItem(args, i+1); 983c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel sqp->it = PyObject_GetIter(curseq); 984c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (sqp->it == NULL) { 985c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel static char errmsg[] = 986c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "argument %d to map() must support iteration"; 987c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char errbuf[sizeof(errmsg) + 25]; 988c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyOS_snprintf(errbuf, sizeof(errbuf), errmsg, i+2); 989c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_TypeError, errbuf); 990c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_2; 991c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 992c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 993c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Update len. */ 994c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel curlen = _PyObject_LengthHint(curseq, 8); 995c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (curlen > len) 996c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel len = curlen; 997c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 998c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 999c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Get space for the result list. */ 1000c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if ((result = (PyObject *) PyList_New(len)) == NULL) 1001c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_2; 1002c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1003c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Iterate over the sequences until all have stopped. */ 1004c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel for (i = 0; ; ++i) { 1005c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *alist, *item=NULL, *value; 1006c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int numactive = 0; 1007c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1008c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (func == Py_None && n == 1) 1009c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel alist = NULL; 1010c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else if ((alist = PyTuple_New(n)) == NULL) 1011c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_1; 1012c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1013c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel for (j = 0, sqp = seqs; j < n; ++j, ++sqp) { 1014c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (sqp->saw_StopIteration) { 1015c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(Py_None); 1016c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel item = Py_None; 1017c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1018c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 1019c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel item = PyIter_Next(sqp->it); 1020c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (item) 1021c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ++numactive; 1022c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 1023c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyErr_Occurred()) { 1024c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(alist); 1025c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_1; 1026c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1027c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(Py_None); 1028c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel item = Py_None; 1029c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel sqp->saw_StopIteration = 1; 1030c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1031c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1032c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (alist) 1033c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyTuple_SET_ITEM(alist, j, item); 1034c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else 1035c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel break; 1036c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1037c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1038c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!alist) 1039c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel alist = item; 1040c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1041c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (numactive == 0) { 1042c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(alist); 1043c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel break; 1044c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1045c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1046c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (func == Py_None) 1047c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel value = alist; 1048c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 1049c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel value = PyEval_CallObject(func, alist); 1050c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(alist); 1051c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (value == NULL) 1052c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_1; 1053c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1054c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (i >= len) { 1055c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int status = PyList_Append(result, value); 1056c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(value); 1057c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (status < 0) 1058c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_1; 1059c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1060c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else if (PyList_SetItem(result, i, value) < 0) 1061c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_1; 1062c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1063c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1064c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (i < len && PyList_SetSlice(result, i, len, NULL) < 0) 1065c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_1; 1066c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1067c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Succeed; 1068c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1069c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFail_1: 1070c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(result); 1071c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFail_2: 1072c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel result = NULL; 1073c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielSucceed: 1074c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel assert(seqs); 1075c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel for (i = 0; i < n; ++i) 1076c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(seqs[i].it); 1077c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyMem_DEL(seqs); 1078c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return result; 1079c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1080c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1081c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(map_doc, 1082c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"map(function, sequence[, sequence, ...]) -> list\n\ 1083c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1084c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn a list of the results of applying the function to the items of\n\ 1085c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielthe argument sequence(s). If more than one sequence is given, the\n\ 1086c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielfunction is called with an argument list consisting of the corresponding\n\ 1087c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielitem of each sequence, substituting None for missing values when not all\n\ 1088c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsequences have the same length. If the function is None, return a list of\n\ 1089c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielthe items of the sequence (or a list of tuples if more than one sequence)."); 1090c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1091c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1092c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 1093c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_next(PyObject *self, PyObject *args) 1094c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1095c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *it, *res; 1096c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *def = NULL; 1097c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1098c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_UnpackTuple(args, "next", 1, 2, &it, &def)) 1099c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1100c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyIter_Check(it)) { 1101c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Format(PyExc_TypeError, 1102c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "%.200s object is not an iterator", 1103c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel it->ob_type->tp_name); 1104c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1105c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1106c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1107c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel res = (*it->ob_type->tp_iternext)(it); 1108c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (res != NULL) { 1109c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return res; 1110c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } else if (def != NULL) { 1111c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyErr_Occurred()) { 1112c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyErr_ExceptionMatches(PyExc_StopIteration)) 1113c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1114c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Clear(); 1115c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1116c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(def); 1117c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return def; 1118c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } else if (PyErr_Occurred()) { 1119c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1120c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } else { 1121c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetNone(PyExc_StopIteration); 1122c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1123c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1124c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1125c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1126c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(next_doc, 1127c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"next(iterator[, default])\n\ 1128c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1129c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the next item from the iterator. If default is given and the iterator\n\ 1130c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielis exhausted, it is returned instead of raising StopIteration."); 1131c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1132c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1133c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 1134c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_setattr(PyObject *self, PyObject *args) 1135c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1136c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *v; 1137c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *name; 1138c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *value; 1139c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1140c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_UnpackTuple(args, "setattr", 3, 3, &v, &name, &value)) 1141c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1142c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyObject_SetAttr(v, name, value) != 0) 1143c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1144c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(Py_None); 1145c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return Py_None; 1146c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1147c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1148c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(setattr_doc, 1149c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"setattr(object, name, value)\n\ 1150c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1151c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielSet a named attribute on an object; setattr(x, 'y', v) is equivalent to\n\ 1152c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel``x.y = v''."); 1153c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1154c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1155c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 1156c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_delattr(PyObject *self, PyObject *args) 1157c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1158c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *v; 1159c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *name; 1160c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1161c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_UnpackTuple(args, "delattr", 2, 2, &v, &name)) 1162c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1163c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyObject_SetAttr(v, name, (PyObject *)NULL) != 0) 1164c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1165c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(Py_None); 1166c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return Py_None; 1167c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1168c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1169c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(delattr_doc, 1170c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"delattr(object, name)\n\ 1171c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1172c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielDelete a named attribute on an object; delattr(x, 'y') is equivalent to\n\ 1173c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel``del x.y''."); 1174c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1175c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1176c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 1177c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_hash(PyObject *self, PyObject *v) 1178c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1179c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel long x; 1180c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1181c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel x = PyObject_Hash(v); 1182c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (x == -1) 1183c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1184c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyInt_FromLong(x); 1185c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1186c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1187c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(hash_doc, 1188c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"hash(object) -> integer\n\ 1189c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1190c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn a hash value for the object. Two objects with the same value have\n\ 1191c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielthe same hash value. The reverse is not necessarily true, but likely."); 1192c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1193c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1194c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 1195c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_hex(PyObject *self, PyObject *v) 1196c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1197c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyNumberMethods *nb; 1198c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *res; 1199c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1200c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if ((nb = v->ob_type->tp_as_number) == NULL || 1201c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel nb->nb_hex == NULL) { 1202c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_TypeError, 1203c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "hex() argument can't be converted to hex"); 1204c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1205c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1206c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel res = (*nb->nb_hex)(v); 1207c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (res && !PyString_Check(res)) { 1208c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Format(PyExc_TypeError, 1209c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "__hex__ returned non-string (type %.200s)", 1210c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel res->ob_type->tp_name); 1211c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(res); 1212c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1213c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1214c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return res; 1215c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1216c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1217c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(hex_doc, 1218c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"hex(number) -> string\n\ 1219c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1220c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the hexadecimal representation of an integer or long integer."); 1221c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1222c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1223c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *builtin_raw_input(PyObject *, PyObject *); 1224c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1225c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 1226c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_input(PyObject *self, PyObject *args) 1227c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1228c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *line; 1229c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char *str; 1230c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *res; 1231c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *globals, *locals; 1232c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyCompilerFlags cf; 1233c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1234c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel line = builtin_raw_input(self, args); 1235c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (line == NULL) 1236c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return line; 1237c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str)) 1238c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1239c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel while (*str == ' ' || *str == '\t') 1240c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel str++; 1241c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel globals = PyEval_GetGlobals(); 1242c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel locals = PyEval_GetLocals(); 1243c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyDict_GetItemString(globals, "__builtins__") == NULL) { 1244c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyDict_SetItemString(globals, "__builtins__", 1245c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyEval_GetBuiltins()) != 0) 1246c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1247c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1248c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel cf.cf_flags = 0; 1249c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyEval_MergeCompilerFlags(&cf); 1250c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel res = PyRun_StringFlags(str, Py_eval_input, globals, locals, &cf); 1251c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(line); 1252c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return res; 1253c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1254c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1255c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(input_doc, 1256c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"input([prompt]) -> value\n\ 1257c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1258c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielEquivalent to eval(raw_input(prompt))."); 1259c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1260c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1261c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 1262c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_intern(PyObject *self, PyObject *args) 1263c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1264c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *s; 1265c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_ParseTuple(args, "S:intern", &s)) 1266c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1267c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyString_CheckExact(s)) { 1268c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_TypeError, 1269c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "can't intern subclass of string"); 1270c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1271c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1272c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(s); 1273c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyString_InternInPlace(&s); 1274c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return s; 1275c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1276c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1277c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(intern_doc, 1278c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"intern(string) -> string\n\ 1279c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1280c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel``Intern'' the given string. This enters the string in the (global)\n\ 1281c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltable of interned strings whose purpose is to speed up dictionary lookups.\n\ 1282c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the string itself or the previously interned string object with the\n\ 1283c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsame value."); 1284c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1285c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1286c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 1287c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_iter(PyObject *self, PyObject *args) 1288c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1289c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *v, *w = NULL; 1290c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1291c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_UnpackTuple(args, "iter", 1, 2, &v, &w)) 1292c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1293c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (w == NULL) 1294c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyObject_GetIter(v); 1295c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyCallable_Check(v)) { 1296c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_TypeError, 1297c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "iter(v, w): v must be callable"); 1298c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1299c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1300c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyCallIter_New(v, w); 1301c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1302c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1303c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(iter_doc, 1304c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"iter(collection) -> iterator\n\ 1305c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieliter(callable, sentinel) -> iterator\n\ 1306c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1307c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielGet an iterator from an object. In the first form, the argument must\n\ 1308c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsupply its own iterator, or be a sequence.\n\ 1309c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielIn the second form, the callable is called until it returns the sentinel."); 1310c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1311c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1312c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 1313c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_len(PyObject *self, PyObject *v) 1314c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1315c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_ssize_t res; 1316c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1317c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel res = PyObject_Size(v); 1318c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (res < 0 && PyErr_Occurred()) 1319c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1320c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyInt_FromSsize_t(res); 1321c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1322c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1323c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(len_doc, 1324c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"len(object) -> integer\n\ 1325c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1326c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the number of items of a sequence or collection."); 1327c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1328c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1329c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 1330c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_locals(PyObject *self) 1331c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1332c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *d; 1333c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1334c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel d = PyEval_GetLocals(); 1335c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XINCREF(d); 1336c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return d; 1337c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1338c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1339c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(locals_doc, 1340c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"locals() -> dictionary\n\ 1341c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1342c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielUpdate and return a dictionary containing the current scope's local variables."); 1343c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1344c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1345c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 1346c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielmin_max(PyObject *args, PyObject *kwds, int op) 1347c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1348c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *v, *it, *item, *val, *maxitem, *maxval, *keyfunc=NULL; 1349c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel const char *name = op == Py_LT ? "min" : "max"; 1350c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1351c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyTuple_Size(args) > 1) 1352c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel v = args; 1353c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else if (!PyArg_UnpackTuple(args, (char *)name, 1, 1, &v)) 1354c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1355c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1356c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (kwds != NULL && PyDict_Check(kwds) && PyDict_Size(kwds)) { 1357c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel keyfunc = PyDict_GetItemString(kwds, "key"); 1358c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyDict_Size(kwds)!=1 || keyfunc == NULL) { 1359c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Format(PyExc_TypeError, 1360c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "%s() got an unexpected keyword argument", name); 1361c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1362c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1363c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(keyfunc); 1364c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1365c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1366c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel it = PyObject_GetIter(v); 1367c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (it == NULL) { 1368c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(keyfunc); 1369c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1370c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1371c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1372c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel maxitem = NULL; /* the result */ 1373c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel maxval = NULL; /* the value associated with the result */ 1374c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel while (( item = PyIter_Next(it) )) { 1375c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* get the value from the key function */ 1376c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (keyfunc != NULL) { 1377c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel val = PyObject_CallFunctionObjArgs(keyfunc, item, NULL); 1378c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (val == NULL) 1379c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_it_item; 1380c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1381c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* no key function; the value is the item */ 1382c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 1383c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel val = item; 1384c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(val); 1385c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1386c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1387c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* maximum value and item are unset; set them */ 1388c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (maxval == NULL) { 1389c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel maxitem = item; 1390c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel maxval = val; 1391c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1392c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* maximum value and item are set; update them as necessary */ 1393c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 1394c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int cmp = PyObject_RichCompareBool(val, maxval, op); 1395c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (cmp < 0) 1396c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_it_item_and_val; 1397c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else if (cmp > 0) { 1398c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(maxval); 1399c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(maxitem); 1400c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel maxval = val; 1401c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel maxitem = item; 1402c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1403c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 1404c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 1405c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(val); 1406c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1407c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1408c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1409c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyErr_Occurred()) 1410c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_it; 1411c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (maxval == NULL) { 1412c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Format(PyExc_ValueError, 1413c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "%s() arg is an empty sequence", name); 1414c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel assert(maxitem == NULL); 1415c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1416c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else 1417c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(maxval); 1418c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(it); 1419c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(keyfunc); 1420c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return maxitem; 1421c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1422c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFail_it_item_and_val: 1423c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(val); 1424c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFail_it_item: 1425c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 1426c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFail_it: 1427c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(maxval); 1428c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(maxitem); 1429c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(it); 1430c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(keyfunc); 1431c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1432c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1433c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1434c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 1435c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_min(PyObject *self, PyObject *args, PyObject *kwds) 1436c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1437c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return min_max(args, kwds, Py_LT); 1438c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1439c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1440c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(min_doc, 1441c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"min(iterable[, key=func]) -> value\n\ 1442c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielmin(a, b, c, ...[, key=func]) -> value\n\ 1443c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1444c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielWith a single iterable argument, return its smallest item.\n\ 1445c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielWith two or more arguments, return the smallest argument."); 1446c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1447c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1448c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 1449c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_max(PyObject *self, PyObject *args, PyObject *kwds) 1450c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1451c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return min_max(args, kwds, Py_GT); 1452c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1453c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1454c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(max_doc, 1455c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"max(iterable[, key=func]) -> value\n\ 1456c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielmax(a, b, c, ...[, key=func]) -> value\n\ 1457c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1458c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielWith a single iterable argument, return its largest item.\n\ 1459c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielWith two or more arguments, return the largest argument."); 1460c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1461c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1462c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 1463c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_oct(PyObject *self, PyObject *v) 1464c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1465c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyNumberMethods *nb; 1466c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *res; 1467c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1468c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL || 1469c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel nb->nb_oct == NULL) { 1470c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_TypeError, 1471c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "oct() argument can't be converted to oct"); 1472c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1473c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1474c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel res = (*nb->nb_oct)(v); 1475c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (res && !PyString_Check(res)) { 1476c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Format(PyExc_TypeError, 1477c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "__oct__ returned non-string (type %.200s)", 1478c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel res->ob_type->tp_name); 1479c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(res); 1480c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1481c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1482c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return res; 1483c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1484c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1485c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(oct_doc, 1486c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"oct(number) -> string\n\ 1487c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1488c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the octal representation of an integer or long integer."); 1489c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1490c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1491c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 1492c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_open(PyObject *self, PyObject *args, PyObject *kwds) 1493c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1494c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyObject_Call((PyObject*)&PyFile_Type, args, kwds); 1495c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1496c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1497c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(open_doc, 1498c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"open(name[, mode[, buffering]]) -> file object\n\ 1499c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1500c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielOpen a file using the file() type, returns a file object. This is the\n\ 1501c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielpreferred way to open a file. See file.__doc__ for further information."); 1502c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1503c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1504c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 1505c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_ord(PyObject *self, PyObject* obj) 1506c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1507c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel long ord; 1508c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_ssize_t size; 1509c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1510c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyString_Check(obj)) { 1511c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel size = PyString_GET_SIZE(obj); 1512c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (size == 1) { 1513c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ord = (long)((unsigned char)*PyString_AS_STRING(obj)); 1514c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyInt_FromLong(ord); 1515c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1516c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } else if (PyByteArray_Check(obj)) { 1517c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel size = PyByteArray_GET_SIZE(obj); 1518c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (size == 1) { 1519c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ord = (long)((unsigned char)*PyByteArray_AS_STRING(obj)); 1520c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyInt_FromLong(ord); 1521c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1522c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1523c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE 1524c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } else if (PyUnicode_Check(obj)) { 1525c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel size = PyUnicode_GET_SIZE(obj); 1526c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (size == 1) { 1527c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ord = (long)*PyUnicode_AS_UNICODE(obj); 1528c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyInt_FromLong(ord); 1529c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1530c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 1531c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } else { 1532c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Format(PyExc_TypeError, 1533c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "ord() expected string of length 1, but " \ 1534c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "%.200s found", obj->ob_type->tp_name); 1535c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1536c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1537c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1538c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Format(PyExc_TypeError, 1539c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "ord() expected a character, " 1540c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "but string of length %zd found", 1541c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel size); 1542c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1543c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1544c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1545c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(ord_doc, 1546c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"ord(c) -> integer\n\ 1547c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1548c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the integer ordinal of a one-character string."); 1549c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1550c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1551c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 1552c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_pow(PyObject *self, PyObject *args) 1553c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1554c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *v, *w, *z = Py_None; 1555c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1556c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_UnpackTuple(args, "pow", 2, 3, &v, &w, &z)) 1557c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1558c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyNumber_Power(v, w, z); 1559c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1560c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1561c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(pow_doc, 1562c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"pow(x, y[, z]) -> number\n\ 1563c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1564c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielWith two arguments, equivalent to x**y. With three arguments,\n\ 1565c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielequivalent to (x**y) % z, but may be more efficient (e.g. for longs)."); 1566c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1567c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1568c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 1569c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_print(PyObject *self, PyObject *args, PyObject *kwds) 1570c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1571c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel static char *kwlist[] = {"sep", "end", "file", 0}; 1572c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel static PyObject *dummy_args = NULL; 1573c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel static PyObject *unicode_newline = NULL, *unicode_space = NULL; 1574c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel static PyObject *str_newline = NULL, *str_space = NULL; 1575c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *newline, *space; 1576c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *sep = NULL, *end = NULL, *file = NULL; 1577c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int i, err, use_unicode = 0; 1578c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1579c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (dummy_args == NULL) { 1580c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!(dummy_args = PyTuple_New(0))) 1581c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1582c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1583c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (str_newline == NULL) { 1584c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel str_newline = PyString_FromString("\n"); 1585c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (str_newline == NULL) 1586c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1587c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel str_space = PyString_FromString(" "); 1588c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (str_space == NULL) { 1589c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_CLEAR(str_newline); 1590c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1591c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1592c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE 1593c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel unicode_newline = PyUnicode_FromString("\n"); 1594c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (unicode_newline == NULL) { 1595c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_CLEAR(str_newline); 1596c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_CLEAR(str_space); 1597c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1598c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1599c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel unicode_space = PyUnicode_FromString(" "); 1600c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (unicode_space == NULL) { 1601c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_CLEAR(str_newline); 1602c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_CLEAR(str_space); 1603c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_CLEAR(unicode_space); 1604c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1605c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1606c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 1607c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1608c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_ParseTupleAndKeywords(dummy_args, kwds, "|OOO:print", 1609c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel kwlist, &sep, &end, &file)) 1610c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1611c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (file == NULL || file == Py_None) { 1612c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel file = PySys_GetObject("stdout"); 1613c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* sys.stdout may be None when FILE* stdout isn't connected */ 1614c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (file == Py_None) 1615c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_RETURN_NONE; 1616c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1617c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (sep == Py_None) { 1618c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel sep = NULL; 1619c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1620c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else if (sep) { 1621c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyUnicode_Check(sep)) { 1622c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel use_unicode = 1; 1623c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1624c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else if (!PyString_Check(sep)) { 1625c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Format(PyExc_TypeError, 1626c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "sep must be None, str or unicode, not %.200s", 1627c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel sep->ob_type->tp_name); 1628c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1629c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1630c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1631c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (end == Py_None) 1632c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel end = NULL; 1633c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else if (end) { 1634c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyUnicode_Check(end)) { 1635c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel use_unicode = 1; 1636c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1637c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else if (!PyString_Check(end)) { 1638c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Format(PyExc_TypeError, 1639c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "end must be None, str or unicode, not %.200s", 1640c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel end->ob_type->tp_name); 1641c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1642c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1643c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1644c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1645c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!use_unicode) { 1646c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel for (i = 0; i < PyTuple_Size(args); i++) { 1647c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyUnicode_Check(PyTuple_GET_ITEM(args, i))) { 1648c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel use_unicode = 1; 1649c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel break; 1650c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1651c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1652c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1653c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (use_unicode) { 1654c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel newline = unicode_newline; 1655c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel space = unicode_space; 1656c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1657c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 1658c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel newline = str_newline; 1659c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel space = str_space; 1660c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1661c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1662c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel for (i = 0; i < PyTuple_Size(args); i++) { 1663c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (i > 0) { 1664c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (sep == NULL) 1665c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel err = PyFile_WriteObject(space, file, 1666c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_PRINT_RAW); 1667c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else 1668c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel err = PyFile_WriteObject(sep, file, 1669c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_PRINT_RAW); 1670c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (err) 1671c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1672c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1673c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel err = PyFile_WriteObject(PyTuple_GetItem(args, i), file, 1674c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_PRINT_RAW); 1675c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (err) 1676c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1677c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1678c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1679c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (end == NULL) 1680c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel err = PyFile_WriteObject(newline, file, Py_PRINT_RAW); 1681c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else 1682c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel err = PyFile_WriteObject(end, file, Py_PRINT_RAW); 1683c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (err) 1684c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1685c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1686c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_RETURN_NONE; 1687c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1688c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1689c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(print_doc, 1690c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"print(value, ..., sep=' ', end='\\n', file=sys.stdout)\n\ 1691c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1692c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPrints the values to a stream, or to sys.stdout by default.\n\ 1693c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielOptional keyword arguments:\n\ 1694c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielfile: a file-like object (stream); defaults to the current sys.stdout.\n\ 1695c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsep: string inserted between values, default a space.\n\ 1696c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielend: string appended after the last value, default a newline."); 1697c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1698c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1699c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Return number of items in range (lo, hi, step), when arguments are 1700c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * PyInt or PyLong objects. step > 0 required. Return a value < 0 if 1701c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * & only if the true value is too large to fit in a signed long. 1702c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Arguments MUST return 1 with either PyInt_Check() or 1703c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * PyLong_Check(). Return -1 when there is an error. 1704c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 1705c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic long 1706c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielget_len_of_range_longs(PyObject *lo, PyObject *hi, PyObject *step) 1707c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1708c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* ------------------------------------------------------------- 1709c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Algorithm is equal to that of get_len_of_range(), but it operates 1710c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel on PyObjects (which are assumed to be PyLong or PyInt objects). 1711c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ---------------------------------------------------------------*/ 1712c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel long n; 1713c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *diff = NULL; 1714c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *one = NULL; 1715c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *tmp1 = NULL, *tmp2 = NULL, *tmp3 = NULL; 1716c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* holds sub-expression evaluations */ 1717c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1718c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* if (lo >= hi), return length of 0. */ 1719c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyObject_Compare(lo, hi) >= 0) 1720c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return 0; 1721c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1722c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if ((one = PyLong_FromLong(1L)) == NULL) 1723c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail; 1724c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1725c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if ((tmp1 = PyNumber_Subtract(hi, lo)) == NULL) 1726c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail; 1727c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1728c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if ((diff = PyNumber_Subtract(tmp1, one)) == NULL) 1729c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail; 1730c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1731c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if ((tmp2 = PyNumber_FloorDivide(diff, step)) == NULL) 1732c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail; 1733c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1734c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if ((tmp3 = PyNumber_Add(tmp2, one)) == NULL) 1735c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail; 1736c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1737c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel n = PyLong_AsLong(tmp3); 1738c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyErr_Occurred()) { /* Check for Overflow */ 1739c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Clear(); 1740c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail; 1741c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1742c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1743c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(tmp3); 1744c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(tmp2); 1745c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(diff); 1746c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(tmp1); 1747c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(one); 1748c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return n; 1749c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1750c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Fail: 1751c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(tmp3); 1752c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(tmp2); 1753c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(diff); 1754c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(tmp1); 1755c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(one); 1756c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return -1; 1757c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1758c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1759c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Helper function for handle_range_longs. If arg is int or long 1760c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel object, returns it with incremented reference count. If arg is 1761c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel float, raises type error. As a last resort, creates a new int by 1762c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel calling arg type's nb_int method if it is defined. Returns NULL 1763c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel and sets exception on error. 1764c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1765c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Returns a new reference to an int object. */ 1766c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 1767c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielget_range_long_argument(PyObject *arg, const char *name) 1768c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1769c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *v; 1770c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyNumberMethods *nb; 1771c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyInt_Check(arg) || PyLong_Check(arg)) { 1772c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(arg); 1773c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return arg; 1774c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1775c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyFloat_Check(arg) || 1776c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel (nb = Py_TYPE(arg)->tp_as_number) == NULL || 1777c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel nb->nb_int == NULL) { 1778c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Format(PyExc_TypeError, 1779c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "range() integer %s argument expected, got %s.", 1780c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel name, arg->ob_type->tp_name); 1781c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1782c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1783c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel v = nb->nb_int(arg); 1784c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (v == NULL) 1785c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1786c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyInt_Check(v) || PyLong_Check(v)) 1787c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return v; 1788c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(v); 1789c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_TypeError, 1790c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "__int__ should return int object"); 1791c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1792c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1793c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1794c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* An extension of builtin_range() that handles the case when PyLong 1795c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * arguments are given. */ 1796c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 1797c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielhandle_range_longs(PyObject *self, PyObject *args) 1798c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1799c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *ilow = NULL; 1800c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *ihigh = NULL; 1801c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *istep = NULL; 1802c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1803c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *low = NULL; 1804c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *high = NULL; 1805c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *step = NULL; 1806c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1807c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *curnum = NULL; 1808c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *v = NULL; 1809c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel long bign; 1810c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_ssize_t i, n; 1811c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int cmp_result; 1812c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1813c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *zero = PyLong_FromLong(0); 1814c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1815c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (zero == NULL) 1816c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1817c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1818c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_UnpackTuple(args, "range", 1, 3, &ilow, &ihigh, &istep)) { 1819c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(zero); 1820c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1821c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1822c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1823c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Figure out which way we were called, supply defaults, and be 1824c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * sure to incref everything so that the decrefs at the end 1825c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * are correct. NB: ilow, ihigh and istep are borrowed references. 1826c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 1827c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel assert(ilow != NULL); 1828c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (ihigh == NULL) { 1829c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* only 1 arg -- it's the upper limit */ 1830c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ihigh = ilow; 1831c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ilow = NULL; 1832c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1833c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1834c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* convert ihigh if necessary */ 1835c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel assert(ihigh != NULL); 1836c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel high = get_range_long_argument(ihigh, "end"); 1837c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (high == NULL) 1838c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail; 1839c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1840c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* ihigh correct now; do ilow */ 1841c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (ilow == NULL) { 1842c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(zero); 1843c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel low = zero; 1844c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1845c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 1846c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel low = get_range_long_argument(ilow, "start"); 1847c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (low == NULL) 1848c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail; 1849c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1850c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1851c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* ilow and ihigh correct now; do istep */ 1852c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (istep == NULL) 1853c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel step = PyLong_FromLong(1); 1854c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else 1855c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel step = get_range_long_argument(istep, "step"); 1856c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (step == NULL) 1857c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail; 1858c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1859c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyObject_Cmp(step, zero, &cmp_result) == -1) 1860c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail; 1861c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1862c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (cmp_result == 0) { 1863c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_ValueError, 1864c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "range() step argument must not be zero"); 1865c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail; 1866c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1867c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1868c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (cmp_result > 0) 1869c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel bign = get_len_of_range_longs(low, high, step); 1870c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 1871c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *neg_step = PyNumber_Negative(step); 1872c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (neg_step == NULL) 1873c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail; 1874c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel bign = get_len_of_range_longs(high, low, neg_step); 1875c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(neg_step); 1876c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1877c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1878c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel n = (Py_ssize_t)bign; 1879c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (bign < 0 || (long)n != bign) { 1880c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_OverflowError, 1881c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "range() result has too many items"); 1882c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail; 1883c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1884c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1885c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel v = PyList_New(n); 1886c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (v == NULL) 1887c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail; 1888c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1889c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel curnum = low; 1890c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(curnum); 1891c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1892c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel for (i = 0; i < n; i++) { 1893c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *w = PyNumber_Long(curnum); 1894c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *tmp_num; 1895c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (w == NULL) 1896c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail; 1897c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1898c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyList_SET_ITEM(v, i, w); 1899c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1900c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel tmp_num = PyNumber_Add(curnum, step); 1901c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (tmp_num == NULL) 1902c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail; 1903c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1904c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(curnum); 1905c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel curnum = tmp_num; 1906c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1907c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(low); 1908c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(high); 1909c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(step); 1910c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(zero); 1911c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(curnum); 1912c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return v; 1913c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1914c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Fail: 1915c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(low); 1916c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(high); 1917c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(step); 1918c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(zero); 1919c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(curnum); 1920c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(v); 1921c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1922c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1923c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1924c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Return number of items in range/xrange (lo, hi, step). step > 0 1925c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * required. Return a value < 0 if & only if the true value is too 1926c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * large to fit in a signed long. 1927c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 1928c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic long 1929c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielget_len_of_range(long lo, long hi, long step) 1930c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1931c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* ------------------------------------------------------------- 1932c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel If lo >= hi, the range is empty. 1933c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Else if n values are in the range, the last one is 1934c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel lo + (n-1)*step, which must be <= hi-1. Rearranging, 1935c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel n <= (hi - lo - 1)/step + 1, so taking the floor of the RHS gives 1936c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel the proper value. Since lo < hi in this case, hi-lo-1 >= 0, so 1937c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel the RHS is non-negative and so truncation is the same as the 1938c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel floor. Letting M be the largest positive long, the worst case 1939c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel for the RHS numerator is hi=M, lo=-M-1, and then 1940c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel hi-lo-1 = M-(-M-1)-1 = 2*M. Therefore unsigned long has enough 1941c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel precision to compute the RHS exactly. 1942c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ---------------------------------------------------------------*/ 1943c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel long n = 0; 1944c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (lo < hi) { 1945c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel unsigned long uhi = (unsigned long)hi; 1946c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel unsigned long ulo = (unsigned long)lo; 1947c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel unsigned long diff = uhi - ulo - 1; 1948c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel n = (long)(diff / (unsigned long)step + 1); 1949c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1950c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return n; 1951c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1952c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1953c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 1954c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_range(PyObject *self, PyObject *args) 1955c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1956c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel long ilow = 0, ihigh = 0, istep = 1; 1957c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel long bign; 1958c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_ssize_t i, n; 1959c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1960c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *v; 1961c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1962c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyTuple_Size(args) <= 1) { 1963c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_ParseTuple(args, 1964c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "l;range() requires 1-3 int arguments", 1965c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel &ihigh)) { 1966c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Clear(); 1967c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return handle_range_longs(self, args); 1968c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1969c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1970c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 1971c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_ParseTuple(args, 1972c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "ll|l;range() requires 1-3 int arguments", 1973c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel &ilow, &ihigh, &istep)) { 1974c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Clear(); 1975c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return handle_range_longs(self, args); 1976c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1977c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1978c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (istep == 0) { 1979c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_ValueError, 1980c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "range() step argument must not be zero"); 1981c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1982c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1983c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (istep > 0) 1984c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel bign = get_len_of_range(ilow, ihigh, istep); 1985c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else 1986c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel bign = get_len_of_range(ihigh, ilow, -istep); 1987c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel n = (Py_ssize_t)bign; 1988c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (bign < 0 || (long)n != bign) { 1989c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_OverflowError, 1990c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "range() result has too many items"); 1991c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1992c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1993c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel v = PyList_New(n); 1994c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (v == NULL) 1995c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1996c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel for (i = 0; i < n; i++) { 1997c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *w = PyInt_FromLong(ilow); 1998c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (w == NULL) { 1999c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(v); 2000c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2001c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2002c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyList_SET_ITEM(v, i, w); 2003c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ilow += istep; 2004c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2005c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return v; 2006c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 2007c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2008c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(range_doc, 2009c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"range(stop) -> list of integers\n\ 2010c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielrange(start, stop[, step]) -> list of integers\n\ 2011c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 2012c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn a list containing an arithmetic progression of integers.\n\ 2013c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielrange(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.\n\ 2014c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielWhen step is given, it specifies the increment (or decrement).\n\ 2015c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFor example, range(4) returns [0, 1, 2, 3]. The end point is omitted!\n\ 2016c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielThese are exactly the valid indices for a list of 4 elements."); 2017c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2018c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2019c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 2020c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_raw_input(PyObject *self, PyObject *args) 2021c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 2022c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *v = NULL; 2023c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *fin = PySys_GetObject("stdin"); 2024c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *fout = PySys_GetObject("stdout"); 2025c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2026c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_UnpackTuple(args, "[raw_]input", 0, 1, &v)) 2027c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2028c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2029c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (fin == NULL) { 2030c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_RuntimeError, "[raw_]input: lost sys.stdin"); 2031c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2032c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2033c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (fout == NULL) { 2034c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_RuntimeError, "[raw_]input: lost sys.stdout"); 2035c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2036c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2037c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyFile_SoftSpace(fout, 0)) { 2038c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyFile_WriteString(" ", fout) != 0) 2039c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2040c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2041c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyFile_AsFile(fin) && PyFile_AsFile(fout) 2042c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel && isatty(fileno(PyFile_AsFile(fin))) 2043c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel && isatty(fileno(PyFile_AsFile(fout)))) { 2044c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *po; 2045c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char *prompt; 2046c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char *s; 2047c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *result; 2048c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (v != NULL) { 2049c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel po = PyObject_Str(v); 2050c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (po == NULL) 2051c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2052c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel prompt = PyString_AsString(po); 2053c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (prompt == NULL) 2054c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2055c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2056c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 2057c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel po = NULL; 2058c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel prompt = ""; 2059c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2060c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel s = PyOS_Readline(PyFile_AsFile(fin), PyFile_AsFile(fout), 2061c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel prompt); 2062c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(po); 2063c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (s == NULL) { 2064c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyErr_Occurred()) 2065c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetNone(PyExc_KeyboardInterrupt); 2066c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2067c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2068c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (*s == '\0') { 2069c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetNone(PyExc_EOFError); 2070c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel result = NULL; 2071c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2072c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { /* strip trailing '\n' */ 2073c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel size_t len = strlen(s); 2074c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (len > PY_SSIZE_T_MAX) { 2075c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_OverflowError, 2076c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "[raw_]input: input too long"); 2077c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel result = NULL; 2078c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2079c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 2080c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel result = PyString_FromStringAndSize(s, len-1); 2081c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2082c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2083c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyMem_FREE(s); 2084c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return result; 2085c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2086c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (v != NULL) { 2087c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyFile_WriteObject(v, fout, Py_PRINT_RAW) != 0) 2088c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2089c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2090c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyFile_GetLine(fin, -1); 2091c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 2092c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2093c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(raw_input_doc, 2094c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"raw_input([prompt]) -> string\n\ 2095c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 2096c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielRead a string from standard input. The trailing newline is stripped.\n\ 2097c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielIf the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.\n\ 2098c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielOn Unix, GNU readline is used if enabled. The prompt string, if given,\n\ 2099c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielis printed without a trailing newline before reading."); 2100c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2101c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2102c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 2103c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_reduce(PyObject *self, PyObject *args) 2104c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 2105c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel static PyObject *functools_reduce = NULL; 2106c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2107c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyErr_WarnPy3k("reduce() not supported in 3.x; " 2108c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "use functools.reduce()", 1) < 0) 2109c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2110c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2111c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (functools_reduce == NULL) { 2112c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *functools = PyImport_ImportModule("functools"); 2113c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (functools == NULL) 2114c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2115c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel functools_reduce = PyObject_GetAttrString(functools, "reduce"); 2116c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(functools); 2117c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (functools_reduce == NULL) 2118c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2119c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2120c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyObject_Call(functools_reduce, args, NULL); 2121c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 2122c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2123c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(reduce_doc, 2124c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"reduce(function, sequence[, initial]) -> value\n\ 2125c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 2126c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielApply a function of two arguments cumulatively to the items of a sequence,\n\ 2127c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielfrom left to right, so as to reduce the sequence to a single value.\n\ 2128c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFor example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\ 2129c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel((((1+2)+3)+4)+5). If initial is present, it is placed before the items\n\ 2130c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielof the sequence in the calculation, and serves as a default when the\n\ 2131c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsequence is empty."); 2132c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2133c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2134c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 2135c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_reload(PyObject *self, PyObject *v) 2136c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 2137c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyErr_WarnPy3k("In 3.x, reload() is renamed to imp.reload()", 2138c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1) < 0) 2139c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2140c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2141c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyImport_ReloadModule(v); 2142c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 2143c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2144c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(reload_doc, 2145c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"reload(module) -> module\n\ 2146c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 2147c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReload the module. The module must have been successfully imported before."); 2148c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2149c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2150c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 2151c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_repr(PyObject *self, PyObject *v) 2152c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 2153c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyObject_Repr(v); 2154c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 2155c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2156c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(repr_doc, 2157c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"repr(object) -> string\n\ 2158c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 2159c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the canonical string representation of the object.\n\ 2160c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFor most object types, eval(repr(object)) == object."); 2161c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2162c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2163c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 2164c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_round(PyObject *self, PyObject *args, PyObject *kwds) 2165c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 2166c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel double x; 2167c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *o_ndigits = NULL; 2168c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_ssize_t ndigits; 2169c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel static char *kwlist[] = {"number", "ndigits", 0}; 2170c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2171c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_ParseTupleAndKeywords(args, kwds, "d|O:round", 2172c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel kwlist, &x, &o_ndigits)) 2173c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2174c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2175c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (o_ndigits == NULL) { 2176c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* second argument defaults to 0 */ 2177c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ndigits = 0; 2178c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2179c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 2180c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* interpret 2nd argument as a Py_ssize_t; clip on overflow */ 2181c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ndigits = PyNumber_AsSsize_t(o_ndigits, NULL); 2182c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (ndigits == -1 && PyErr_Occurred()) 2183c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2184c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2185c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2186c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* nans, infinities and zeros round to themselves */ 2187c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!Py_IS_FINITE(x) || x == 0.0) 2188c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyFloat_FromDouble(x); 2189c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2190c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Deal with extreme values for ndigits. For ndigits > NDIGITS_MAX, x 2191c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel always rounds to itself. For ndigits < NDIGITS_MIN, x always 2192c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel rounds to +-0.0. Here 0.30103 is an upper bound for log10(2). */ 2193c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define NDIGITS_MAX ((int)((DBL_MANT_DIG-DBL_MIN_EXP) * 0.30103)) 2194c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define NDIGITS_MIN (-(int)((DBL_MAX_EXP + 1) * 0.30103)) 2195c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (ndigits > NDIGITS_MAX) 2196c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* return x */ 2197c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyFloat_FromDouble(x); 2198c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else if (ndigits < NDIGITS_MIN) 2199c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* return 0.0, but with sign of x */ 2200c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyFloat_FromDouble(0.0*x); 2201c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else 2202c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* finite x, and ndigits is not unreasonably large */ 2203c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* _Py_double_round is defined in floatobject.c */ 2204c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return _Py_double_round(x, (int)ndigits); 2205c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#undef NDIGITS_MAX 2206c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#undef NDIGITS_MIN 2207c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 2208c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2209c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(round_doc, 2210c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"round(number[, ndigits]) -> floating point number\n\ 2211c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 2212c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielRound a number to a given precision in decimal digits (default 0 digits).\n\ 2213c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielThis always returns a floating point number. Precision may be negative."); 2214c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2215c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 2216c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_sorted(PyObject *self, PyObject *args, PyObject *kwds) 2217c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 2218c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *newlist, *v, *seq, *compare=NULL, *keyfunc=NULL, *newargs; 2219c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *callable; 2220c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel static char *kwlist[] = {"iterable", "cmp", "key", "reverse", 0}; 2221c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int reverse; 2222c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2223c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* args 1-4 should match listsort in Objects/listobject.c */ 2224c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|OOi:sorted", 2225c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel kwlist, &seq, &compare, &keyfunc, &reverse)) 2226c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2227c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2228c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel newlist = PySequence_List(seq); 2229c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (newlist == NULL) 2230c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2231c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2232c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel callable = PyObject_GetAttrString(newlist, "sort"); 2233c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (callable == NULL) { 2234c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(newlist); 2235c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2236c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2237c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2238c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel newargs = PyTuple_GetSlice(args, 1, 4); 2239c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (newargs == NULL) { 2240c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(newlist); 2241c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(callable); 2242c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2243c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2244c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2245c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel v = PyObject_Call(callable, newargs, kwds); 2246c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(newargs); 2247c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(callable); 2248c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (v == NULL) { 2249c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(newlist); 2250c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2251c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2252c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(v); 2253c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return newlist; 2254c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 2255c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2256c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(sorted_doc, 2257c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list"); 2258c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2259c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 2260c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_vars(PyObject *self, PyObject *args) 2261c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 2262c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *v = NULL; 2263c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *d; 2264c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2265c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_UnpackTuple(args, "vars", 0, 1, &v)) 2266c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2267c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (v == NULL) { 2268c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel d = PyEval_GetLocals(); 2269c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (d == NULL) { 2270c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyErr_Occurred()) 2271c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_SystemError, 2272c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "vars(): no locals!?"); 2273c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2274c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else 2275c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(d); 2276c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2277c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 2278c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel d = PyObject_GetAttrString(v, "__dict__"); 2279c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (d == NULL) { 2280c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_TypeError, 2281c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "vars() argument must have __dict__ attribute"); 2282c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2283c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2284c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2285c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return d; 2286c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 2287c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2288c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(vars_doc, 2289c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"vars([object]) -> dictionary\n\ 2290c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 2291c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielWithout arguments, equivalent to locals().\n\ 2292c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielWith an argument, equivalent to object.__dict__."); 2293c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2294c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2295c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject* 2296c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_sum(PyObject *self, PyObject *args) 2297c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 2298c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *seq; 2299c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *result = NULL; 2300c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *temp, *item, *iter; 2301c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2302c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_UnpackTuple(args, "sum", 1, 2, &seq, &result)) 2303c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2304c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2305c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel iter = PyObject_GetIter(seq); 2306c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (iter == NULL) 2307c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2308c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2309c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (result == NULL) { 2310c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel result = PyInt_FromLong(0); 2311c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (result == NULL) { 2312c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(iter); 2313c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2314c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2315c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } else { 2316c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* reject string values for 'start' parameter */ 2317c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyObject_TypeCheck(result, &PyBaseString_Type)) { 2318c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_TypeError, 2319c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "sum() can't sum strings [use ''.join(seq) instead]"); 2320c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(iter); 2321c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2322c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2323c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(result); 2324c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2325c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2326c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef SLOW_SUM 2327c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Fast addition by keeping temporary sums in C instead of new Python objects. 2328c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Assumes all inputs are the same type. If the assumption fails, default 2329c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel to the more general routine. 2330c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 2331c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyInt_CheckExact(result)) { 2332c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel long i_result = PyInt_AS_LONG(result); 2333c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(result); 2334c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel result = NULL; 2335c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel while(result == NULL) { 2336c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel item = PyIter_Next(iter); 2337c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (item == NULL) { 2338c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(iter); 2339c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyErr_Occurred()) 2340c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2341c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyInt_FromLong(i_result); 2342c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2343c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyInt_CheckExact(item)) { 2344c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel long b = PyInt_AS_LONG(item); 2345c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel long x = i_result + b; 2346c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if ((x^i_result) >= 0 || (x^b) >= 0) { 2347c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel i_result = x; 2348c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 2349c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel continue; 2350c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2351c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2352c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Either overflowed or is not an int. Restore real objects and process normally */ 2353c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel result = PyInt_FromLong(i_result); 2354c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel temp = PyNumber_Add(result, item); 2355c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(result); 2356c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 2357c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel result = temp; 2358c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (result == NULL) { 2359c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(iter); 2360c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2361c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2362c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2363c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2364c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2365c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyFloat_CheckExact(result)) { 2366c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel double f_result = PyFloat_AS_DOUBLE(result); 2367c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(result); 2368c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel result = NULL; 2369c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel while(result == NULL) { 2370c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel item = PyIter_Next(iter); 2371c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (item == NULL) { 2372c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(iter); 2373c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyErr_Occurred()) 2374c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2375c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyFloat_FromDouble(f_result); 2376c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2377c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyFloat_CheckExact(item)) { 2378c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyFPE_START_PROTECT("add", Py_DECREF(item); Py_DECREF(iter); return 0) 2379c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel f_result += PyFloat_AS_DOUBLE(item); 2380c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyFPE_END_PROTECT(f_result) 2381c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 2382c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel continue; 2383c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2384c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyInt_CheckExact(item)) { 2385c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyFPE_START_PROTECT("add", Py_DECREF(item); Py_DECREF(iter); return 0) 2386c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel f_result += (double)PyInt_AS_LONG(item); 2387c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyFPE_END_PROTECT(f_result) 2388c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 2389c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel continue; 2390c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2391c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel result = PyFloat_FromDouble(f_result); 2392c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel temp = PyNumber_Add(result, item); 2393c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(result); 2394c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 2395c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel result = temp; 2396c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (result == NULL) { 2397c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(iter); 2398c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2399c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2400c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2401c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2402c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 2403c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2404c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel for(;;) { 2405c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel item = PyIter_Next(iter); 2406c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (item == NULL) { 2407c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* error, or end-of-sequence */ 2408c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyErr_Occurred()) { 2409c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(result); 2410c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel result = NULL; 2411c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2412c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel break; 2413c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2414c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* It's tempting to use PyNumber_InPlaceAdd instead of 2415c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyNumber_Add here, to avoid quadratic running time 2416c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel when doing 'sum(list_of_lists, [])'. However, this 2417c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel would produce a change in behaviour: a snippet like 2418c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2419c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel empty = [] 2420c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel sum([[x] for x in range(10)], empty) 2421c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2422c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel would change the value of empty. */ 2423c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel temp = PyNumber_Add(result, item); 2424c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(result); 2425c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 2426c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel result = temp; 2427c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (result == NULL) 2428c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel break; 2429c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2430c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(iter); 2431c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return result; 2432c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 2433c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2434c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(sum_doc, 2435c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"sum(sequence[, start]) -> value\n\ 2436c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 2437c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the sum of a sequence of numbers (NOT strings) plus the value\n\ 2438c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielof parameter 'start' (which defaults to 0). When the sequence is\n\ 2439c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielempty, return start."); 2440c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2441c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2442c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 2443c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_isinstance(PyObject *self, PyObject *args) 2444c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 2445c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *inst; 2446c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *cls; 2447c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int retval; 2448c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2449c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_UnpackTuple(args, "isinstance", 2, 2, &inst, &cls)) 2450c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2451c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2452c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel retval = PyObject_IsInstance(inst, cls); 2453c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (retval < 0) 2454c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2455c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyBool_FromLong(retval); 2456c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 2457c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2458c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(isinstance_doc, 2459c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"isinstance(object, class-or-type-or-tuple) -> bool\n\ 2460c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 2461c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn whether an object is an instance of a class or of a subclass thereof.\n\ 2462c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielWith a type as second argument, return whether that is the object's type.\n\ 2463c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielThe form using a tuple, isinstance(x, (A, B, ...)), is a shortcut for\n\ 2464c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielisinstance(x, A) or isinstance(x, B) or ... (etc.)."); 2465c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2466c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2467c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 2468c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_issubclass(PyObject *self, PyObject *args) 2469c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 2470c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *derived; 2471c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *cls; 2472c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int retval; 2473c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2474c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_UnpackTuple(args, "issubclass", 2, 2, &derived, &cls)) 2475c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2476c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2477c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel retval = PyObject_IsSubclass(derived, cls); 2478c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (retval < 0) 2479c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2480c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyBool_FromLong(retval); 2481c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 2482c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2483c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(issubclass_doc, 2484c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"issubclass(C, B) -> bool\n\ 2485c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 2486c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn whether class C is a subclass (i.e., a derived class) of class B.\n\ 2487c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielWhen using a tuple as the second argument issubclass(X, (A, B, ...)),\n\ 2488c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielis a shortcut for issubclass(X, A) or issubclass(X, B) or ... (etc.)."); 2489c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2490c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2491c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject* 2492c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_zip(PyObject *self, PyObject *args) 2493c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 2494c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *ret; 2495c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel const Py_ssize_t itemsize = PySequence_Length(args); 2496c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_ssize_t i; 2497c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *itlist; /* tuple of iterators */ 2498c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_ssize_t len; /* guess at result length */ 2499c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2500c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (itemsize == 0) 2501c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyList_New(0); 2502c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2503c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* args must be a tuple */ 2504c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel assert(PyTuple_Check(args)); 2505c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2506c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Guess at result length: the shortest of the input lengths. 2507c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel If some argument refuses to say, we refuse to guess too, lest 2508c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel an argument like xrange(sys.maxint) lead us astray.*/ 2509c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel len = -1; /* unknown */ 2510c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel for (i = 0; i < itemsize; ++i) { 2511c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *item = PyTuple_GET_ITEM(args, i); 2512c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_ssize_t thislen = _PyObject_LengthHint(item, -2); 2513c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (thislen < 0) { 2514c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (thislen == -1) 2515c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2516c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel len = -1; 2517c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel break; 2518c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2519c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else if (len < 0 || thislen < len) 2520c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel len = thislen; 2521c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2522c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2523c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* allocate result list */ 2524c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (len < 0) 2525c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel len = 10; /* arbitrary */ 2526c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if ((ret = PyList_New(len)) == NULL) 2527c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2528c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2529c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* obtain iterators */ 2530c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel itlist = PyTuple_New(itemsize); 2531c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (itlist == NULL) 2532c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_ret; 2533c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel for (i = 0; i < itemsize; ++i) { 2534c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *item = PyTuple_GET_ITEM(args, i); 2535c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *it = PyObject_GetIter(item); 2536c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (it == NULL) { 2537c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyErr_ExceptionMatches(PyExc_TypeError)) 2538c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Format(PyExc_TypeError, 2539c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "zip argument #%zd must support iteration", 2540c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel i+1); 2541c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_ret_itlist; 2542c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2543c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyTuple_SET_ITEM(itlist, i, it); 2544c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2545c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2546c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* build result into ret list */ 2547c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel for (i = 0; ; ++i) { 2548c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int j; 2549c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *next = PyTuple_New(itemsize); 2550c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!next) 2551c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_ret_itlist; 2552c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2553c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel for (j = 0; j < itemsize; j++) { 2554c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *it = PyTuple_GET_ITEM(itlist, j); 2555c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *item = PyIter_Next(it); 2556c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!item) { 2557c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyErr_Occurred()) { 2558c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(ret); 2559c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ret = NULL; 2560c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2561c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(next); 2562c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(itlist); 2563c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Done; 2564c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2565c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyTuple_SET_ITEM(next, j, item); 2566c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2567c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2568c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (i < len) 2569c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyList_SET_ITEM(ret, i, next); 2570c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 2571c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int status = PyList_Append(ret, next); 2572c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(next); 2573c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ++len; 2574c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (status < 0) 2575c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_ret_itlist; 2576c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2577c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2578c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2579c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielDone: 2580c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (ret != NULL && i < len) { 2581c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* The list is too big. */ 2582c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyList_SetSlice(ret, i, len, NULL) < 0) 2583c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2584c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2585c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return ret; 2586c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2587c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFail_ret_itlist: 2588c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(itlist); 2589c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFail_ret: 2590c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(ret); 2591c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2592c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 2593c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2594c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2595c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(zip_doc, 2596c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]\n\ 2597c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 2598c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn a list of tuples, where each tuple contains the i-th element\n\ 2599c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielfrom each of the argument sequences. The returned list is truncated\n\ 2600c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielin length to the length of the shortest argument sequence."); 2601c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2602c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2603c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyMethodDef builtin_methods[] = { 2604c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"__import__", (PyCFunction)builtin___import__, METH_VARARGS | METH_KEYWORDS, import_doc}, 2605c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"abs", builtin_abs, METH_O, abs_doc}, 2606c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"all", builtin_all, METH_O, all_doc}, 2607c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"any", builtin_any, METH_O, any_doc}, 2608c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"apply", builtin_apply, METH_VARARGS, apply_doc}, 2609c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"bin", builtin_bin, METH_O, bin_doc}, 2610c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"callable", builtin_callable, METH_O, callable_doc}, 2611c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"chr", builtin_chr, METH_VARARGS, chr_doc}, 2612c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"cmp", builtin_cmp, METH_VARARGS, cmp_doc}, 2613c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"coerce", builtin_coerce, METH_VARARGS, coerce_doc}, 2614c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"compile", (PyCFunction)builtin_compile, METH_VARARGS | METH_KEYWORDS, compile_doc}, 2615c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"delattr", builtin_delattr, METH_VARARGS, delattr_doc}, 2616c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"dir", builtin_dir, METH_VARARGS, dir_doc}, 2617c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"divmod", builtin_divmod, METH_VARARGS, divmod_doc}, 2618c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"eval", builtin_eval, METH_VARARGS, eval_doc}, 2619c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"execfile", builtin_execfile, METH_VARARGS, execfile_doc}, 2620c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"filter", builtin_filter, METH_VARARGS, filter_doc}, 2621c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"format", builtin_format, METH_VARARGS, format_doc}, 2622c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"getattr", builtin_getattr, METH_VARARGS, getattr_doc}, 2623c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"globals", (PyCFunction)builtin_globals, METH_NOARGS, globals_doc}, 2624c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"hasattr", builtin_hasattr, METH_VARARGS, hasattr_doc}, 2625c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"hash", builtin_hash, METH_O, hash_doc}, 2626c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"hex", builtin_hex, METH_O, hex_doc}, 2627c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"id", builtin_id, METH_O, id_doc}, 2628c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"input", builtin_input, METH_VARARGS, input_doc}, 2629c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"intern", builtin_intern, METH_VARARGS, intern_doc}, 2630c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"isinstance", builtin_isinstance, METH_VARARGS, isinstance_doc}, 2631c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"issubclass", builtin_issubclass, METH_VARARGS, issubclass_doc}, 2632c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"iter", builtin_iter, METH_VARARGS, iter_doc}, 2633c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"len", builtin_len, METH_O, len_doc}, 2634c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"locals", (PyCFunction)builtin_locals, METH_NOARGS, locals_doc}, 2635c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"map", builtin_map, METH_VARARGS, map_doc}, 2636c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"max", (PyCFunction)builtin_max, METH_VARARGS | METH_KEYWORDS, max_doc}, 2637c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"min", (PyCFunction)builtin_min, METH_VARARGS | METH_KEYWORDS, min_doc}, 2638c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"next", builtin_next, METH_VARARGS, next_doc}, 2639c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"oct", builtin_oct, METH_O, oct_doc}, 2640c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"open", (PyCFunction)builtin_open, METH_VARARGS | METH_KEYWORDS, open_doc}, 2641c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"ord", builtin_ord, METH_O, ord_doc}, 2642c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"pow", builtin_pow, METH_VARARGS, pow_doc}, 2643c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"print", (PyCFunction)builtin_print, METH_VARARGS | METH_KEYWORDS, print_doc}, 2644c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"range", builtin_range, METH_VARARGS, range_doc}, 2645c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"raw_input", builtin_raw_input, METH_VARARGS, raw_input_doc}, 2646c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"reduce", builtin_reduce, METH_VARARGS, reduce_doc}, 2647c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"reload", builtin_reload, METH_O, reload_doc}, 2648c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"repr", builtin_repr, METH_O, repr_doc}, 2649c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"round", (PyCFunction)builtin_round, METH_VARARGS | METH_KEYWORDS, round_doc}, 2650c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"setattr", builtin_setattr, METH_VARARGS, setattr_doc}, 2651c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"sorted", (PyCFunction)builtin_sorted, METH_VARARGS | METH_KEYWORDS, sorted_doc}, 2652c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"sum", builtin_sum, METH_VARARGS, sum_doc}, 2653c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE 2654c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"unichr", builtin_unichr, METH_VARARGS, unichr_doc}, 2655c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 2656c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"vars", builtin_vars, METH_VARARGS, vars_doc}, 2657c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"zip", builtin_zip, METH_VARARGS, zip_doc}, 2658c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {NULL, NULL}, 2659c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}; 2660c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2661c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(builtin_doc, 2662c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"Built-in functions, exceptions, and other objects.\n\ 2663c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 2664c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielNoteworthy: None is the `nil' object; Ellipsis represents `...' in slices."); 2665c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2666c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyObject * 2667c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel_PyBuiltin_Init(void) 2668c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 2669c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *mod, *dict, *debug; 2670c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel mod = Py_InitModule4("__builtin__", builtin_methods, 2671c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel builtin_doc, (PyObject *)NULL, 2672c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PYTHON_API_VERSION); 2673c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (mod == NULL) 2674c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2675c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel dict = PyModule_GetDict(mod); 2676c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2677c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_TRACE_REFS 2678c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* __builtin__ exposes a number of statically allocated objects 2679c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * that, before this code was added in 2.3, never showed up in 2680c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * the list of "all objects" maintained by Py_TRACE_REFS. As a 2681c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * result, programs leaking references to None and False (etc) 2682c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * couldn't be diagnosed by examining sys.getobjects(0). 2683c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 2684c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define ADD_TO_ALL(OBJECT) _Py_AddToAllObjects((PyObject *)(OBJECT), 0) 2685c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else 2686c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define ADD_TO_ALL(OBJECT) (void)0 2687c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 2688c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2689c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define SETBUILTIN(NAME, OBJECT) \ 2690c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyDict_SetItemString(dict, NAME, (PyObject *)OBJECT) < 0) \ 2691c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; \ 2692c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ADD_TO_ALL(OBJECT) 2693c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2694c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("None", Py_None); 2695c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("Ellipsis", Py_Ellipsis); 2696c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("NotImplemented", Py_NotImplemented); 2697c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("False", Py_False); 2698c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("True", Py_True); 2699c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("basestring", &PyBaseString_Type); 2700c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("bool", &PyBool_Type); 2701c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("memoryview", &PyMemoryView_Type); 2702c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("bytearray", &PyByteArray_Type); 2703c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("bytes", &PyString_Type); 2704c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("buffer", &PyBuffer_Type); 2705c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("classmethod", &PyClassMethod_Type); 2706c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef WITHOUT_COMPLEX 2707c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("complex", &PyComplex_Type); 2708c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 2709c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("dict", &PyDict_Type); 2710c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("enumerate", &PyEnum_Type); 2711c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("file", &PyFile_Type); 2712c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("float", &PyFloat_Type); 2713c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("frozenset", &PyFrozenSet_Type); 2714c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("property", &PyProperty_Type); 2715c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("int", &PyInt_Type); 2716c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("list", &PyList_Type); 2717c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("long", &PyLong_Type); 2718c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("object", &PyBaseObject_Type); 2719c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("reversed", &PyReversed_Type); 2720c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("set", &PySet_Type); 2721c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("slice", &PySlice_Type); 2722c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("staticmethod", &PyStaticMethod_Type); 2723c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("str", &PyString_Type); 2724c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("super", &PySuper_Type); 2725c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("tuple", &PyTuple_Type); 2726c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("type", &PyType_Type); 2727c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("xrange", &PyRange_Type); 2728c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE 2729c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SETBUILTIN("unicode", &PyUnicode_Type); 2730c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 2731c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel debug = PyBool_FromLong(Py_OptimizeFlag == 0); 2732c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyDict_SetItemString(dict, "__debug__", debug) < 0) { 2733c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(debug); 2734c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2735c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2736c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(debug); 2737c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2738c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return mod; 2739c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#undef ADD_TO_ALL 2740c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#undef SETBUILTIN 2741c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 2742c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2743c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Helper for filter(): filter a tuple through a function */ 2744c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2745c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 2746c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielfiltertuple(PyObject *func, PyObject *tuple) 2747c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 2748c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *result; 2749c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_ssize_t i, j; 2750c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_ssize_t len = PyTuple_Size(tuple); 2751c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2752c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (len == 0) { 2753c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyTuple_CheckExact(tuple)) 2754c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(tuple); 2755c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else 2756c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel tuple = PyTuple_New(0); 2757c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return tuple; 2758c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2759c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2760c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if ((result = PyTuple_New(len)) == NULL) 2761c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2762c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2763c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel for (i = j = 0; i < len; ++i) { 2764c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *item, *good; 2765c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int ok; 2766c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2767c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (tuple->ob_type->tp_as_sequence && 2768c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel tuple->ob_type->tp_as_sequence->sq_item) { 2769c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel item = tuple->ob_type->tp_as_sequence->sq_item(tuple, i); 2770c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (item == NULL) 2771c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_1; 2772c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } else { 2773c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_TypeError, "filter(): unsubscriptable tuple"); 2774c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_1; 2775c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2776c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (func == Py_None) { 2777c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(item); 2778c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel good = item; 2779c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2780c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 2781c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *arg = PyTuple_Pack(1, item); 2782c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (arg == NULL) { 2783c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 2784c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_1; 2785c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2786c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel good = PyEval_CallObject(func, arg); 2787c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(arg); 2788c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (good == NULL) { 2789c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 2790c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_1; 2791c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2792c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2793c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ok = PyObject_IsTrue(good); 2794c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(good); 2795c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (ok > 0) { 2796c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyTuple_SetItem(result, j++, item) < 0) 2797c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_1; 2798c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2799c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 2800c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 2801c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (ok < 0) 2802c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_1; 2803c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2804c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2805c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2806c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (_PyTuple_Resize(&result, j) < 0) 2807c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2808c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2809c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return result; 2810c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2811c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFail_1: 2812c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(result); 2813c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2814c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 2815c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2816c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2817c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Helper for filter(): filter a string through a function */ 2818c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2819c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 2820c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielfilterstring(PyObject *func, PyObject *strobj) 2821c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 2822c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *result; 2823c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_ssize_t i, j; 2824c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_ssize_t len = PyString_Size(strobj); 2825c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_ssize_t outlen = len; 2826c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2827c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (func == Py_None) { 2828c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* If it's a real string we can return the original, 2829c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * as no character is ever false and __getitem__ 2830c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * does return this character. If it's a subclass 2831c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * we must go through the __getitem__ loop */ 2832c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyString_CheckExact(strobj)) { 2833c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(strobj); 2834c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return strobj; 2835c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2836c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2837c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if ((result = PyString_FromStringAndSize(NULL, len)) == NULL) 2838c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2839c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2840c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel for (i = j = 0; i < len; ++i) { 2841c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *item; 2842c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int ok; 2843c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2844c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i); 2845c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (item == NULL) 2846c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_1; 2847c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (func==Py_None) { 2848c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ok = 1; 2849c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } else { 2850c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *arg, *good; 2851c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel arg = PyTuple_Pack(1, item); 2852c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (arg == NULL) { 2853c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 2854c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_1; 2855c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2856c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel good = PyEval_CallObject(func, arg); 2857c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(arg); 2858c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (good == NULL) { 2859c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 2860c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_1; 2861c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2862c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ok = PyObject_IsTrue(good); 2863c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(good); 2864c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2865c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (ok > 0) { 2866c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_ssize_t reslen; 2867c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyString_Check(item)) { 2868c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_TypeError, "can't filter str to str:" 2869c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel " __getitem__ returned different type"); 2870c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 2871c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_1; 2872c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2873c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel reslen = PyString_GET_SIZE(item); 2874c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (reslen == 1) { 2875c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyString_AS_STRING(result)[j++] = 2876c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyString_AS_STRING(item)[0]; 2877c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } else { 2878c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* do we need more space? */ 2879c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_ssize_t need = j; 2880c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2881c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* calculate space requirements while checking for overflow */ 2882c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (need > PY_SSIZE_T_MAX - reslen) { 2883c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 2884c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_1; 2885c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2886c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2887c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel need += reslen; 2888c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2889c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (need > PY_SSIZE_T_MAX - len) { 2890c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 2891c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_1; 2892c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2893c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2894c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel need += len; 2895c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2896c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (need <= i) { 2897c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 2898c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_1; 2899c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2900c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2901c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel need = need - i - 1; 2902c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2903c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel assert(need >= 0); 2904c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel assert(outlen >= 0); 2905c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2906c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (need > outlen) { 2907c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* overallocate, to avoid reallocations */ 2908c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (outlen > PY_SSIZE_T_MAX / 2) { 2909c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 2910c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2911c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2912c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2913c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (need<2*outlen) { 2914c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel need = 2*outlen; 2915c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2916c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (_PyString_Resize(&result, need)) { 2917c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 2918c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2919c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2920c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel outlen = need; 2921c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2922c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel memcpy( 2923c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyString_AS_STRING(result) + j, 2924c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyString_AS_STRING(item), 2925c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel reslen 2926c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ); 2927c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel j += reslen; 2928c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2929c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2930c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 2931c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (ok < 0) 2932c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_1; 2933c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2934c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2935c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (j < outlen) 2936c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel _PyString_Resize(&result, j); 2937c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2938c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return result; 2939c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2940c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFail_1: 2941c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(result); 2942c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2943c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 2944c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2945c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE 2946c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Helper for filter(): filter a Unicode object through a function */ 2947c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2948c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 2949c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielfilterunicode(PyObject *func, PyObject *strobj) 2950c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 2951c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *result; 2952c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel register Py_ssize_t i, j; 2953c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_ssize_t len = PyUnicode_GetSize(strobj); 2954c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_ssize_t outlen = len; 2955c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2956c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (func == Py_None) { 2957c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* If it's a real string we can return the original, 2958c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * as no character is ever false and __getitem__ 2959c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * does return this character. If it's a subclass 2960c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * we must go through the __getitem__ loop */ 2961c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyUnicode_CheckExact(strobj)) { 2962c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(strobj); 2963c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return strobj; 2964c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2965c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2966c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if ((result = PyUnicode_FromUnicode(NULL, len)) == NULL) 2967c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 2968c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2969c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel for (i = j = 0; i < len; ++i) { 2970c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *item, *arg, *good; 2971c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int ok; 2972c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2973c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i); 2974c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (item == NULL) 2975c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_1; 2976c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (func == Py_None) { 2977c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ok = 1; 2978c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } else { 2979c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel arg = PyTuple_Pack(1, item); 2980c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (arg == NULL) { 2981c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 2982c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_1; 2983c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2984c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel good = PyEval_CallObject(func, arg); 2985c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(arg); 2986c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (good == NULL) { 2987c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 2988c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_1; 2989c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2990c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ok = PyObject_IsTrue(good); 2991c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(good); 2992c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 2993c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (ok > 0) { 2994c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_ssize_t reslen; 2995c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyUnicode_Check(item)) { 2996c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_TypeError, 2997c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "can't filter unicode to unicode:" 2998c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel " __getitem__ returned different type"); 2999c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 3000c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_1; 3001c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 3002c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel reslen = PyUnicode_GET_SIZE(item); 3003c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (reslen == 1) 3004c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyUnicode_AS_UNICODE(result)[j++] = 3005c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyUnicode_AS_UNICODE(item)[0]; 3006c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 3007c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* do we need more space? */ 3008c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_ssize_t need = j + reslen + len - i - 1; 3009c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 3010c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* check that didnt overflow */ 3011c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if ((j > PY_SSIZE_T_MAX - reslen) || 3012c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ((j + reslen) > PY_SSIZE_T_MAX - len) || 3013c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ((j + reslen + len) < i) || 3014c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ((j + reslen + len - i) <= 0)) { 3015c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 3016c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 3017c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 3018c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 3019c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel assert(need >= 0); 3020c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel assert(outlen >= 0); 3021c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 3022c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (need > outlen) { 3023c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* overallocate, 3024c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel to avoid reallocations */ 3025c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (need < 2 * outlen) { 3026c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (outlen > PY_SSIZE_T_MAX / 2) { 3027c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 3028c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 3029c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } else { 3030c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel need = 2 * outlen; 3031c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 3032c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 3033c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 3034c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyUnicode_Resize( 3035c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel &result, need) < 0) { 3036c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 3037c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_1; 3038c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 3039c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel outlen = need; 3040c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 3041c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel memcpy(PyUnicode_AS_UNICODE(result) + j, 3042c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyUnicode_AS_UNICODE(item), 3043c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel reslen*sizeof(Py_UNICODE)); 3044c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel j += reslen; 3045c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 3046c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 3047c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(item); 3048c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (ok < 0) 3049c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel goto Fail_1; 3050c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 3051c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 3052c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (j < outlen) 3053c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyUnicode_Resize(&result, j); 3054c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 3055c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return result; 3056c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 3057c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFail_1: 3058c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(result); 3059c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 3060c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 3061c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 3062