1f70e43a073b36c6f6e9894c01025243a77a452d4Guido van Rossum 285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum/* Module support implementation */ 385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 479f25d9a7b853a9f491a0cfe4b81eeb9e2d19569Guido van Rossum#include "Python.h" 585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 65cb6936672a1410f5502d754570bc548064f9dc4Martin v. Löwis#define FLAG_SIZE_T 1 71d5735e84621a7fe68d361fa0e289fa2c3310836Guido van Rossumtypedef double va_double; 81d5735e84621a7fe68d361fa0e289fa2c3310836Guido van Rossum 95cb6936672a1410f5502d754570bc548064f9dc4Martin v. Löwisstatic PyObject *va_build_value(const char *, va_list, int); 105cb6936672a1410f5502d754570bc548064f9dc4Martin v. Löwis 112e58ff3ef56c3bf0a7080743ec77e95ca1758b97Guido van Rossum/* Package context -- the full module name for package imports */ 122e58ff3ef56c3bf0a7080743ec77e95ca1758b97Guido van Rossumchar *_Py_PackageContext = NULL; 132e58ff3ef56c3bf0a7080743ec77e95ca1758b97Guido van Rossum 1440b33c648a2d777636603356c12b644dd4c92876Guido van Rossum/* Py_InitModule4() parameters: 15970a0a20b881962a950946cbc43e1941827a1e87Guido van Rossum - name is the module name 16970a0a20b881962a950946cbc43e1941827a1e87Guido van Rossum - methods is the list of top-level functions 17970a0a20b881962a950946cbc43e1941827a1e87Guido van Rossum - doc is the documentation string 18970a0a20b881962a950946cbc43e1941827a1e87Guido van Rossum - passthrough is passed as self to functions defined in the module 19970a0a20b881962a950946cbc43e1941827a1e87Guido van Rossum - api_version is the value of PYTHON_API_VERSION at the time the 20970a0a20b881962a950946cbc43e1941827a1e87Guido van Rossum module was compiled 2140b33c648a2d777636603356c12b644dd4c92876Guido van Rossum 2240b33c648a2d777636603356c12b644dd4c92876Guido van Rossum Return value is a borrowed reference to the module object; or NULL 2340b33c648a2d777636603356c12b644dd4c92876Guido van Rossum if an error occurred (in Python 1.4 and before, errors were fatal). 2440b33c648a2d777636603356c12b644dd4c92876Guido van Rossum Errors may still leak memory. 2550620fa9b8cbebb2ac085ea19fca3e14f48e7944Guido van Rossum*/ 261d5735e84621a7fe68d361fa0e289fa2c3310836Guido van Rossum 27970a0a20b881962a950946cbc43e1941827a1e87Guido van Rossumstatic char api_version_warning[] = 28e5006ebc9d0618bc500afebfa1e21b6aae2a22e3Marc-André Lemburg"Python C API version mismatch for module %.100s:\ 29e5006ebc9d0618bc500afebfa1e21b6aae2a22e3Marc-André Lemburg This Python has API version %d, module %.100s has version %d."; 30970a0a20b881962a950946cbc43e1941827a1e87Guido van Rossum 3179f25d9a7b853a9f491a0cfe4b81eeb9e2d19569Guido van RossumPyObject * 32af68c874a6803b4e90b616077a602c0593719a1dJeremy HyltonPy_InitModule4(const char *name, PyMethodDef *methods, const char *doc, 33c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyObject *passthrough, int module_api_version) 3485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum{ 35c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyObject *m, *d, *v, *n; 36c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyMethodDef *ml; 3764a1e7cab1fe8f0b0b42b93bbd40e73fc983c138R. David Murray PyInterpreterState *interp = PyThreadState_Get()->interp; 3864a1e7cab1fe8f0b0b42b93bbd40e73fc983c138R. David Murray if (interp->modules == NULL) 3964a1e7cab1fe8f0b0b42b93bbd40e73fc983c138R. David Murray Py_FatalError("Python import machinery not initialized"); 40c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (module_api_version != PYTHON_API_VERSION) { 41c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou char message[512]; 42c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyOS_snprintf(message, sizeof(message), 43c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou api_version_warning, name, 44c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PYTHON_API_VERSION, name, 45c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou module_api_version); 46c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (PyErr_Warn(PyExc_RuntimeWarning, message)) 47c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return NULL; 48c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 49c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou /* Make sure name is fully qualified. 50c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou 51c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou This is a bit of a hack: when the shared library is loaded, 52c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou the module name is "package.module", but the module calls 53c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_InitModule*() with just "module" for the name. The shared 54c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou library loader squirrels away the true name of the module in 55c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou _Py_PackageContext, and Py_InitModule*() will substitute this 56c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou (if the name actually matches). 57c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou */ 58c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (_Py_PackageContext != NULL) { 59c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou char *p = strrchr(_Py_PackageContext, '.'); 60c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (p != NULL && strcmp(name, p+1) == 0) { 61c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou name = _Py_PackageContext; 62c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou _Py_PackageContext = NULL; 63c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 64c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 65c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if ((m = PyImport_AddModule(name)) == NULL) 66c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return NULL; 67c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou d = PyModule_GetDict(m); 68c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (methods != NULL) { 69c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou n = PyString_FromString(name); 70c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (n == NULL) 71c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return NULL; 72c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou for (ml = methods; ml->ml_name != NULL; ml++) { 73c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if ((ml->ml_flags & METH_CLASS) || 74c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou (ml->ml_flags & METH_STATIC)) { 75c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyErr_SetString(PyExc_ValueError, 76c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou "module functions cannot set" 77c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou " METH_CLASS or METH_STATIC"); 78c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_DECREF(n); 79c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return NULL; 80c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 81c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou v = PyCFunction_NewEx(ml, passthrough, n); 82c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (v == NULL) { 83c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_DECREF(n); 84c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return NULL; 85c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 86c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (PyDict_SetItemString(d, ml->ml_name, v) != 0) { 87c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_DECREF(v); 88c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_DECREF(n); 89c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return NULL; 90c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 91c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_DECREF(v); 92c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 93c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_DECREF(n); 94c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 95c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (doc != NULL) { 96c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou v = PyString_FromString(doc); 97c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (v == NULL || PyDict_SetItemString(d, "__doc__", v) != 0) { 98c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_XDECREF(v); 99c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return NULL; 100c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 101c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_DECREF(v); 102c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 103c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return m; 10485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum} 10585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 10685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 107bf80e5407ffa0fc983eb1da50ffa9330b9eada6eGuido van Rossum/* Helper for mkvalue() to scan the length of a format */ 108fc61adb5f1b562935557a79c9e024fa1eb6e8db1Guido van Rossum 109ceead6d9571673200848a3bc9e4e046832166e20Fred Drakestatic int 110af68c874a6803b4e90b616077a602c0593719a1dJeremy Hyltoncountformat(const char *format, int endchar) 111fc61adb5f1b562935557a79c9e024fa1eb6e8db1Guido van Rossum{ 112c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou int count = 0; 113c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou int level = 0; 114c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou while (level > 0 || *format != endchar) { 115c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou switch (*format) { 116c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case '\0': 117c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou /* Premature end */ 118c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyErr_SetString(PyExc_SystemError, 119c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou "unmatched paren in format"); 120c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return -1; 121c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case '(': 122c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case '[': 123c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case '{': 124c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (level == 0) 125c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou count++; 126c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou level++; 127c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou break; 128c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case ')': 129c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case ']': 130c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case '}': 131c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou level--; 132c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou break; 133c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case '#': 134c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case '&': 135c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case ',': 136c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case ':': 137c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case ' ': 138c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case '\t': 139c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou break; 140c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou default: 141c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (level == 0) 142c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou count++; 143c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 144c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou format++; 145c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 146c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return count; 147fc61adb5f1b562935557a79c9e024fa1eb6e8db1Guido van Rossum} 148fc61adb5f1b562935557a79c9e024fa1eb6e8db1Guido van Rossum 149fc61adb5f1b562935557a79c9e024fa1eb6e8db1Guido van Rossum 150fc61adb5f1b562935557a79c9e024fa1eb6e8db1Guido van Rossum/* Generic function to create a value -- the inverse of getargs() */ 151fc61adb5f1b562935557a79c9e024fa1eb6e8db1Guido van Rossum/* After an original idea and first implementation by Steven Miale */ 152fc61adb5f1b562935557a79c9e024fa1eb6e8db1Guido van Rossum 1535cb6936672a1410f5502d754570bc548064f9dc4Martin v. Löwisstatic PyObject *do_mktuple(const char**, va_list *, int, int, int); 1545cb6936672a1410f5502d754570bc548064f9dc4Martin v. Löwisstatic PyObject *do_mklist(const char**, va_list *, int, int, int); 1555cb6936672a1410f5502d754570bc548064f9dc4Martin v. Löwisstatic PyObject *do_mkdict(const char**, va_list *, int, int, int); 1565cb6936672a1410f5502d754570bc548064f9dc4Martin v. Löwisstatic PyObject *do_mkvalue(const char**, va_list *, int); 157fc61adb5f1b562935557a79c9e024fa1eb6e8db1Guido van Rossum 1581ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum 15912cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchakastatic void 16012cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchakado_ignore(const char **p_format, va_list *p_va, int endchar, int n, int flags) 16112cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka{ 16212cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka PyObject *v; 16312cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka int i; 16412cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka assert(PyErr_Occurred()); 16512cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka v = PyTuple_New(n); 16612cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka for (i = 0; i < n; i++) { 16712cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka PyObject *exception, *value, *tb, *w; 16812cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka PyErr_Fetch(&exception, &value, &tb); 16912cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka w = do_mkvalue(p_format, p_va, flags); 17012cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka PyErr_Restore(exception, value, tb); 17112cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka if (w != NULL) { 17212cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka if (v != NULL) { 17312cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka PyTuple_SET_ITEM(v, i, w); 17412cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka } 17512cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka else { 17612cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka Py_DECREF(w); 17712cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka } 17812cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka } 17912cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka } 18012cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka Py_XDECREF(v); 18112cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka if (**p_format != endchar) { 18212cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka PyErr_SetString(PyExc_SystemError, 18312cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka "Unmatched paren in format"); 18412cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka return; 18512cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka } 18612cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka if (endchar) 18712cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka ++*p_format; 18812cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka} 18912cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka 19079f25d9a7b853a9f491a0cfe4b81eeb9e2d19569Guido van Rossumstatic PyObject * 1915cb6936672a1410f5502d754570bc548064f9dc4Martin v. Löwisdo_mkdict(const char **p_format, va_list *p_va, int endchar, int n, int flags) 1921ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum{ 193c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyObject *d; 194c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou int i; 195c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (n < 0) 196c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return NULL; 19712cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka if (n % 2) { 19812cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka PyErr_SetString(PyExc_SystemError, 19912cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka "Bad dict format"); 20012cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka do_ignore(p_format, p_va, endchar, n, flags); 201c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return NULL; 20212cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka } 203c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou /* Note that we can't bail immediately on error as this will leak 204c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou refcounts on any 'N' arguments. */ 20512cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka if ((d = PyDict_New()) == NULL) { 20612cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka do_ignore(p_format, p_va, endchar, n, flags); 20712cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka return NULL; 20812cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka } 209c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou for (i = 0; i < n; i+= 2) { 210c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyObject *k, *v; 21112cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka 212c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou k = do_mkvalue(p_format, p_va, flags); 213c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (k == NULL) { 21412cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka do_ignore(p_format, p_va, endchar, n - i - 1, flags); 21512cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka Py_DECREF(d); 21612cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka return NULL; 217c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 218c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou v = do_mkvalue(p_format, p_va, flags); 21912cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka if (v == NULL || PyDict_SetItem(d, k, v) < 0) { 22012cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka do_ignore(p_format, p_va, endchar, n - i - 2, flags); 22112cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka Py_DECREF(k); 22212cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka Py_XDECREF(v); 223c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_DECREF(d); 224c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return NULL; 225c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 22612cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka Py_DECREF(k); 22712cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka Py_DECREF(v); 228c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 22912cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka if (**p_format != endchar) { 230c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_DECREF(d); 231c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyErr_SetString(PyExc_SystemError, 232c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou "Unmatched paren in format"); 23312cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka return NULL; 234c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 23512cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka if (endchar) 236c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou ++*p_format; 237c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return d; 2381ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum} 2391ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum 24079f25d9a7b853a9f491a0cfe4b81eeb9e2d19569Guido van Rossumstatic PyObject * 2415cb6936672a1410f5502d754570bc548064f9dc4Martin v. Löwisdo_mklist(const char **p_format, va_list *p_va, int endchar, int n, int flags) 2421ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum{ 243c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyObject *v; 244c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou int i; 245c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (n < 0) 246c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return NULL; 247c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou /* Note that we can't bail immediately on error as this will leak 248c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou refcounts on any 'N' arguments. */ 24912cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka v = PyList_New(n); 25012cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka if (v == NULL) { 25112cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka do_ignore(p_format, p_va, endchar, n, flags); 25212cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka return NULL; 25312cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka } 254c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou for (i = 0; i < n; i++) { 255c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyObject *w = do_mkvalue(p_format, p_va, flags); 256c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (w == NULL) { 25712cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka do_ignore(p_format, p_va, endchar, n - i - 1, flags); 25812cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka Py_DECREF(v); 25912cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka return NULL; 260c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 261c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyList_SET_ITEM(v, i, w); 262c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 263c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (**p_format != endchar) { 264c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_DECREF(v); 265c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyErr_SetString(PyExc_SystemError, 266c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou "Unmatched paren in format"); 267c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return NULL; 268c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 269c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (endchar) 270c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou ++*p_format; 271c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return v; 2721ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum} 2731ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum 274339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis#ifdef Py_USING_UNICODE 27525d34473c3c2429f0bf5c27e147fe57c6a718e99Fred Drakestatic int 27625d34473c3c2429f0bf5c27e147fe57c6a718e99Fred Drake_ustrlen(Py_UNICODE *u) 27725d34473c3c2429f0bf5c27e147fe57c6a718e99Fred Drake{ 278c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou int i = 0; 279c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_UNICODE *v = u; 280c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou while (*v != 0) { i++; v++; } 281c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return i; 28225d34473c3c2429f0bf5c27e147fe57c6a718e99Fred Drake} 283339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis#endif 28425d34473c3c2429f0bf5c27e147fe57c6a718e99Fred Drake 28579f25d9a7b853a9f491a0cfe4b81eeb9e2d19569Guido van Rossumstatic PyObject * 2865cb6936672a1410f5502d754570bc548064f9dc4Martin v. Löwisdo_mktuple(const char **p_format, va_list *p_va, int endchar, int n, int flags) 287fc61adb5f1b562935557a79c9e024fa1eb6e8db1Guido van Rossum{ 288c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyObject *v; 289c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou int i; 290c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (n < 0) 291c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return NULL; 292c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou /* Note that we can't bail immediately on error as this will leak 293c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou refcounts on any 'N' arguments. */ 29412cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka if ((v = PyTuple_New(n)) == NULL) { 29512cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka do_ignore(p_format, p_va, endchar, n, flags); 29612cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka return NULL; 29712cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka } 298c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou for (i = 0; i < n; i++) { 299c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyObject *w = do_mkvalue(p_format, p_va, flags); 300c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (w == NULL) { 30112cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka do_ignore(p_format, p_va, endchar, n - i - 1, flags); 30212cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka Py_DECREF(v); 30312cf60c7fa8f49997ce4d20be3bd814d736feecaSerhiy Storchaka return NULL; 304c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 305c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyTuple_SET_ITEM(v, i, w); 306c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 307c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (**p_format != endchar) { 308c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_DECREF(v); 309c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyErr_SetString(PyExc_SystemError, 310c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou "Unmatched paren in format"); 311c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return NULL; 312c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 313c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (endchar) 314c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou ++*p_format; 315c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return v; 316fc61adb5f1b562935557a79c9e024fa1eb6e8db1Guido van Rossum} 317fc61adb5f1b562935557a79c9e024fa1eb6e8db1Guido van Rossum 31879f25d9a7b853a9f491a0cfe4b81eeb9e2d19569Guido van Rossumstatic PyObject * 3195cb6936672a1410f5502d754570bc548064f9dc4Martin v. Löwisdo_mkvalue(const char **p_format, va_list *p_va, int flags) 320899dcf36a04a401381fbfdcc3e355010543dc3c3Guido van Rossum{ 321c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou for (;;) { 322c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou switch (*(*p_format)++) { 323c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case '(': 324c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return do_mktuple(p_format, p_va, ')', 325c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou countformat(*p_format, ')'), flags); 326c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou 327c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case '[': 328c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return do_mklist(p_format, p_va, ']', 329c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou countformat(*p_format, ']'), flags); 330c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou 331c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case '{': 332c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return do_mkdict(p_format, p_va, '}', 333c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou countformat(*p_format, '}'), flags); 334c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou 335c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case 'b': 336c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case 'B': 337c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case 'h': 338c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case 'i': 339c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return PyInt_FromLong((long)va_arg(*p_va, int)); 340c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou 341c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case 'H': 342c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return PyInt_FromLong((long)va_arg(*p_va, unsigned int)); 343c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou 344c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case 'I': 345c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou { 346c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou unsigned int n; 347c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou n = va_arg(*p_va, unsigned int); 348c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (n > (unsigned long)PyInt_GetMax()) 349c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return PyLong_FromUnsignedLong((unsigned long)n); 350c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou else 351c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return PyInt_FromLong(n); 352c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 353c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou 354c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case 'n': 35518e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis#if SIZEOF_SIZE_T!=SIZEOF_LONG 356c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return PyInt_FromSsize_t(va_arg(*p_va, Py_ssize_t)); 35718e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis#endif 358c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou /* Fall through from 'n' to 'l' if Py_ssize_t is long */ 359c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case 'l': 360c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return PyInt_FromLong(va_arg(*p_va, long)); 361c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou 362c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case 'k': 363c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou { 364c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou unsigned long n; 365c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou n = va_arg(*p_va, unsigned long); 366c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (n > (unsigned long)PyInt_GetMax()) 367c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return PyLong_FromUnsignedLong(n); 368c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou else 369c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return PyInt_FromLong(n); 370c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 371dbd6503e97264938c8fb4ce099c64da7a475e12eJack Jansen 3723dbba6ec3a065a573216bc79b5e4d655ee0cd899Guido van Rossum#ifdef HAVE_LONG_LONG 373c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case 'L': 374c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return PyLong_FromLongLong((PY_LONG_LONG)va_arg(*p_va, PY_LONG_LONG)); 375dbd6503e97264938c8fb4ce099c64da7a475e12eJack Jansen 376c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case 'K': 377c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return PyLong_FromUnsignedLongLong((PY_LONG_LONG)va_arg(*p_va, unsigned PY_LONG_LONG)); 3781a8791e0b875df8e9428c2d9969f64e5967ac0b4Guido van Rossum#endif 379339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis#ifdef Py_USING_UNICODE 380c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case 'u': 381c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou { 382c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyObject *v; 383c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_UNICODE *u = va_arg(*p_va, Py_UNICODE *); 384c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_ssize_t n; 385c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (**p_format == '#') { 386c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou ++*p_format; 387c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (flags & FLAG_SIZE_T) 388c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou n = va_arg(*p_va, Py_ssize_t); 389c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou else 390c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou n = va_arg(*p_va, int); 391c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 392c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou else 393c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou n = -1; 394c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (u == NULL) { 395c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou v = Py_None; 396c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_INCREF(v); 397c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 398c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou else { 399c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (n < 0) 400c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou n = _ustrlen(u); 401c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou v = PyUnicode_FromUnicode(u, n); 402c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 403c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return v; 404c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 405339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis#endif 406c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case 'f': 407c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case 'd': 408c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return PyFloat_FromDouble( 409c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou (double)va_arg(*p_va, va_double)); 4101ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum 411aec79247b145e6cd5b7a769fd85ab71748d8b247Fred Drake#ifndef WITHOUT_COMPLEX 412c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case 'D': 413c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return PyComplex_FromCComplex( 414c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou *((Py_complex *)va_arg(*p_va, Py_complex *))); 415aec79247b145e6cd5b7a769fd85ab71748d8b247Fred Drake#endif /* WITHOUT_COMPLEX */ 416aec79247b145e6cd5b7a769fd85ab71748d8b247Fred Drake 417c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case 'c': 418c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou { 419c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou char p[1]; 420c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou p[0] = (char)va_arg(*p_va, int); 421c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return PyString_FromStringAndSize(p, 1); 422c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 423c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou 424c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case 's': 425c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case 'z': 426c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou { 427c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyObject *v; 428c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou char *str = va_arg(*p_va, char *); 429c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_ssize_t n; 430c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (**p_format == '#') { 431c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou ++*p_format; 432c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (flags & FLAG_SIZE_T) 433c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou n = va_arg(*p_va, Py_ssize_t); 434c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou else 435c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou n = va_arg(*p_va, int); 436c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 437c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou else 438c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou n = -1; 439c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (str == NULL) { 440c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou v = Py_None; 441c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_INCREF(v); 442c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 443c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou else { 444c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (n < 0) { 445c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou size_t m = strlen(str); 446c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (m > PY_SSIZE_T_MAX) { 447c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyErr_SetString(PyExc_OverflowError, 448c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou "string too long for Python string"); 449c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return NULL; 450c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 451c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou n = (Py_ssize_t)m; 452c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 453c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou v = PyString_FromStringAndSize(str, n); 454c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 455c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return v; 456c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 457c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou 458c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case 'N': 459c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case 'S': 460c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case 'O': 461c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (**p_format == '&') { 462c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou typedef PyObject *(*converter)(void *); 463c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou converter func = va_arg(*p_va, converter); 464c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou void *arg = va_arg(*p_va, void *); 465c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou ++*p_format; 466c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return (*func)(arg); 467c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 468c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou else { 469c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyObject *v; 470c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou v = va_arg(*p_va, PyObject *); 471c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (v != NULL) { 472c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (*(*p_format - 1) != 'N') 473c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_INCREF(v); 474c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 475c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou else if (!PyErr_Occurred()) 476c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou /* If a NULL was passed 477c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou * because a call that should 478c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou * have constructed a value 479c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou * failed, that's OK, and we 480c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou * pass the error on; but if 481c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou * no error occurred it's not 482c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou * clear that the caller knew 483c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou * what she was doing. */ 484c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyErr_SetString(PyExc_SystemError, 485c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou "NULL object passed to Py_BuildValue"); 486c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return v; 487c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 488c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou 489c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case ':': 490c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case ',': 491c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case ' ': 492c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou case '\t': 493c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou break; 494c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou 495c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou default: 496c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyErr_SetString(PyExc_SystemError, 497c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou "bad format char passed to Py_BuildValue"); 498c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return NULL; 499c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou 500c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 501c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 5023cfe6faffeaddd64355d16c358894a31b72e5450Guido van Rossum} 5033cfe6faffeaddd64355d16c358894a31b72e5450Guido van Rossum 5041ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum 505ceead6d9571673200848a3bc9e4e046832166e20Fred DrakePyObject * 506af68c874a6803b4e90b616077a602c0593719a1dJeremy HyltonPy_BuildValue(const char *format, ...) 5073cfe6faffeaddd64355d16c358894a31b72e5450Guido van Rossum{ 508c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou va_list va; 509c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyObject* retval; 510c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou va_start(va, format); 511c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou retval = va_build_value(format, va, 0); 512c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou va_end(va); 513c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return retval; 5145cb6936672a1410f5502d754570bc548064f9dc4Martin v. Löwis} 5155cb6936672a1410f5502d754570bc548064f9dc4Martin v. Löwis 5165cb6936672a1410f5502d754570bc548064f9dc4Martin v. LöwisPyObject * 5175cb6936672a1410f5502d754570bc548064f9dc4Martin v. Löwis_Py_BuildValue_SizeT(const char *format, ...) 5185cb6936672a1410f5502d754570bc548064f9dc4Martin v. Löwis{ 519c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou va_list va; 520c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyObject* retval; 521c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou va_start(va, format); 522c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou retval = va_build_value(format, va, FLAG_SIZE_T); 523c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou va_end(va); 524c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return retval; 5253cfe6faffeaddd64355d16c358894a31b72e5450Guido van Rossum} 526e537240c252ff678d49451ee6f80fa934653a724Guido van Rossum 52779f25d9a7b853a9f491a0cfe4b81eeb9e2d19569Guido van RossumPyObject * 528af68c874a6803b4e90b616077a602c0593719a1dJeremy HyltonPy_VaBuildValue(const char *format, va_list va) 529e537240c252ff678d49451ee6f80fa934653a724Guido van Rossum{ 530c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return va_build_value(format, va, 0); 5315cb6936672a1410f5502d754570bc548064f9dc4Martin v. Löwis} 5325cb6936672a1410f5502d754570bc548064f9dc4Martin v. Löwis 5335cb6936672a1410f5502d754570bc548064f9dc4Martin v. LöwisPyObject * 5345cb6936672a1410f5502d754570bc548064f9dc4Martin v. Löwis_Py_VaBuildValue_SizeT(const char *format, va_list va) 5355cb6936672a1410f5502d754570bc548064f9dc4Martin v. Löwis{ 536c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return va_build_value(format, va, FLAG_SIZE_T); 5375cb6936672a1410f5502d754570bc548064f9dc4Martin v. Löwis} 5385cb6936672a1410f5502d754570bc548064f9dc4Martin v. Löwis 5395cb6936672a1410f5502d754570bc548064f9dc4Martin v. Löwisstatic PyObject * 5405cb6936672a1410f5502d754570bc548064f9dc4Martin v. Löwisva_build_value(const char *format, va_list va, int flags) 5415cb6936672a1410f5502d754570bc548064f9dc4Martin v. Löwis{ 542c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou const char *f = format; 543c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou int n = countformat(f, '\0'); 544c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou va_list lva; 5451ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum 5461ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum#ifdef VA_LIST_IS_ARRAY 547c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou memcpy(lva, va, sizeof(va_list)); 5481ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum#else 54975d2d94e0f049162c6ef353a89c5703eb78eaaf6Martin v. Löwis#ifdef __va_copy 550c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou __va_copy(lva, va); 55175d2d94e0f049162c6ef353a89c5703eb78eaaf6Martin v. Löwis#else 552c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou lva = va; 5531ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum#endif 55475d2d94e0f049162c6ef353a89c5703eb78eaaf6Martin v. Löwis#endif 5551ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum 556c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (n < 0) 557c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return NULL; 558c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (n == 0) { 559c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_INCREF(Py_None); 560c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return Py_None; 561c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 562c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (n == 1) 563c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return do_mkvalue(&f, &lva, flags); 564c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return do_mktuple(&f, &lva, '\0', n, flags); 5651ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum} 5661ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum 5671ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum 56879f25d9a7b853a9f491a0cfe4b81eeb9e2d19569Guido van RossumPyObject * 569af68c874a6803b4e90b616077a602c0593719a1dJeremy HyltonPyEval_CallFunction(PyObject *obj, const char *format, ...) 5701ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum{ 571c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou va_list vargs; 572c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyObject *args; 573c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyObject *res; 5741ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum 575c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou va_start(vargs, format); 5761ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum 577c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou args = Py_VaBuildValue(format, vargs); 578c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou va_end(vargs); 5791ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum 580c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (args == NULL) 581c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return NULL; 5821ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum 583c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou res = PyEval_CallObject(obj, args); 584c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_DECREF(args); 5851ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum 586c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return res; 5871ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum} 5881ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum 5891ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum 59079f25d9a7b853a9f491a0cfe4b81eeb9e2d19569Guido van RossumPyObject * 591af68c874a6803b4e90b616077a602c0593719a1dJeremy HyltonPyEval_CallMethod(PyObject *obj, const char *methodname, const char *format, ...) 5921ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum{ 593c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou va_list vargs; 594c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyObject *meth; 595c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyObject *args; 596c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyObject *res; 5971ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum 598c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou meth = PyObject_GetAttrString(obj, methodname); 599c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (meth == NULL) 600c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return NULL; 6011ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum 602c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou va_start(vargs, format); 6031ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum 604c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou args = Py_VaBuildValue(format, vargs); 605c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou va_end(vargs); 6061ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum 607c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (args == NULL) { 608c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_DECREF(meth); 609c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return NULL; 610c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 6111ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum 612c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou res = PyEval_CallObject(meth, args); 613c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_DECREF(meth); 614c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_DECREF(args); 6151ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum 616c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return res; 617e537240c252ff678d49451ee6f80fa934653a724Guido van Rossum} 6189e2851566c0dd1d27d29ead8988f4cc3ae295ca1Fred Drake 6199e2851566c0dd1d27d29ead8988f4cc3ae295ca1Fred Drakeint 620af68c874a6803b4e90b616077a602c0593719a1dJeremy HyltonPyModule_AddObject(PyObject *m, const char *name, PyObject *o) 6219e2851566c0dd1d27d29ead8988f4cc3ae295ca1Fred Drake{ 622c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyObject *dict; 623c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (!PyModule_Check(m)) { 624c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyErr_SetString(PyExc_TypeError, 625c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou "PyModule_AddObject() needs module as first arg"); 626c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return -1; 627c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 628c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (!o) { 629c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (!PyErr_Occurred()) 630c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyErr_SetString(PyExc_TypeError, 631c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou "PyModule_AddObject() needs non-NULL value"); 632c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return -1; 633c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 634c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou 635c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou dict = PyModule_GetDict(m); 636c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (dict == NULL) { 637c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou /* Internal error -- modules must have a dict! */ 638c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__", 639c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyModule_GetName(m)); 640c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return -1; 641c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 642c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (PyDict_SetItemString(dict, name, o)) 643c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return -1; 644c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_DECREF(o); 645c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return 0; 6469e2851566c0dd1d27d29ead8988f4cc3ae295ca1Fred Drake} 6479e2851566c0dd1d27d29ead8988f4cc3ae295ca1Fred Drake 648c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrouint 649af68c874a6803b4e90b616077a602c0593719a1dJeremy HyltonPyModule_AddIntConstant(PyObject *m, const char *name, long value) 6509e2851566c0dd1d27d29ead8988f4cc3ae295ca1Fred Drake{ 651c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyObject *o = PyInt_FromLong(value); 652c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (!o) 653c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return -1; 654c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (PyModule_AddObject(m, name, o) == 0) 655c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return 0; 656c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_DECREF(o); 657c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return -1; 6589e2851566c0dd1d27d29ead8988f4cc3ae295ca1Fred Drake} 6599e2851566c0dd1d27d29ead8988f4cc3ae295ca1Fred Drake 660c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrouint 661af68c874a6803b4e90b616077a602c0593719a1dJeremy HyltonPyModule_AddStringConstant(PyObject *m, const char *name, const char *value) 6629e2851566c0dd1d27d29ead8988f4cc3ae295ca1Fred Drake{ 663c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyObject *o = PyString_FromString(value); 664c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (!o) 665c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return -1; 666c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (PyModule_AddObject(m, name, o) == 0) 667c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return 0; 668c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou Py_DECREF(o); 669c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return -1; 6709e2851566c0dd1d27d29ead8988f4cc3ae295ca1Fred Drake} 671