bool FillIntVectorFromPySequence(PyObject* datalist, std::vector<int> &data) { data.clear(); // First, try list or tuple iteration (for speed). if(PyListOrTuple_Check(datalist)) { int sequenceSize = PyListOrTuple_GET_SIZE(datalist); data.reserve(sequenceSize); for(int i=0; i < sequenceSize; i++) { PyObject* item = PyListOrTuple_GET_ITEM(datalist, i); int val; if (!GetIntFromPyObject(item, &val)) { data.clear(); return false; } data.push_back(val); } return true; } // As a fallback, try general iteration. else { PyObject *item; PyObject *iter = PyObject_GetIter(datalist); if (iter == NULL) { PyErr_Clear(); return false; } while((item = PyIter_Next(iter)) != NULL) { int val; if (!GetIntFromPyObject(item, &val)) { Py_DECREF(item); Py_DECREF(iter); data.clear(); return false; } data.push_back(val); Py_DECREF(item); } Py_DECREF(iter); if (PyErr_Occurred()) { PyErr_Clear(); data.clear(); return false; } return true; } }
bool FillStringVectorFromPySequence(PyObject* datalist, std::vector<std::string> &data) { data.clear(); if(PyListOrTuple_Check(datalist)) { int sequenceSize = PyListOrTuple_GET_SIZE(datalist); data.reserve(sequenceSize); for(int i=0; i < sequenceSize; i++) { PyObject* item = PyListOrTuple_GET_ITEM(datalist, i); std::string val; if (!GetStringFromPyObject(item, &val)) { data.clear(); return false; } data.push_back( val ); } return true; } else { PyObject *item; PyObject *iter = PyObject_GetIter(datalist); if (iter == NULL) { PyErr_Clear(); return false; } while((item = PyIter_Next(iter)) != NULL) { std::string val; if (!GetStringFromPyObject(item, &val)) { Py_DECREF(item); Py_DECREF(iter); data.clear(); return false; } data.push_back(val); Py_DECREF(item); } Py_DECREF(iter); if (PyErr_Occurred()) { PyErr_Clear(); data.clear(); return false; } return true; } }
static PyObject * do_multi_setopt(CurlMultiObject *self, PyObject *args) { int option, which; PyObject *obj; if (!PyArg_ParseTuple(args, "iO:setopt", &option, &obj)) return NULL; if (check_multi_state(self, 1 | 2, "setopt") != 0) return NULL; /* Early checks of option value */ if (option <= 0) goto error; if (option >= (int)CURLOPTTYPE_OFF_T + MOPTIONS_SIZE) goto error; if (option % 10000 >= MOPTIONS_SIZE) goto error; /* Handle the case of integer arguments */ if (PyInt_Check(obj)) { return do_multi_setopt_int(self, option, obj); } /* Handle the case of list or tuple objects */ which = PyListOrTuple_Check(obj); if (which) { return do_multi_setopt_list(self, option, which, obj); } if (PyFunction_Check(obj) || PyCFunction_Check(obj) || PyCallable_Check(obj) || PyMethod_Check(obj)) { return do_multi_setopt_callable(self, option, obj); } /* Failed to match any of the function signatures -- return error */ error: PyErr_SetString(PyExc_TypeError, "invalid arguments to setopt"); return NULL; }
bool FillTransformVectorFromPySequence(PyObject* datalist, std::vector<ConstTransformRcPtr> &data) { data.clear(); if(PyListOrTuple_Check(datalist)) { int sequenceSize = PyListOrTuple_GET_SIZE(datalist); data.reserve(sequenceSize); for(int i=0; i < sequenceSize; i++) { PyObject* item = PyListOrTuple_GET_ITEM(datalist, i); ConstTransformRcPtr val; try { val = GetConstTransform(item, true); } catch(...) { data.clear(); return false; } data.push_back( val ); } return true; } else { PyObject *item; PyObject *iter = PyObject_GetIter(datalist); if (iter == NULL) { PyErr_Clear(); return false; } while((item = PyIter_Next(iter)) != NULL) { ConstTransformRcPtr val; try { val = GetConstTransform(item, true); } catch(...) { Py_DECREF(item); Py_DECREF(iter); data.clear(); return false; } data.push_back(val); Py_DECREF(item); } Py_DECREF(iter); if (PyErr_Occurred()) { PyErr_Clear(); data.clear(); return false; } return true; } }