int PyObject_AsWriteBuffer(PyObject *obj, void **buffer, int *buffer_len) { PyBufferProcs *pb; void*pp; int len; if (obj == NULL || buffer == NULL || buffer_len == NULL) { null_error(); return -1; } pb = obj->ob_type->tp_as_buffer; if ( pb == NULL || pb->bf_getwritebuffer == NULL || pb->bf_getsegcount == NULL ) { PyErr_SetString(PyExc_TypeError, "expected a writeable buffer object"); goto onError; } if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) { PyErr_SetString(PyExc_TypeError, "expected a single-segment buffer object"); goto onError; } len = (*pb->bf_getwritebuffer)(obj,0,&pp); if (len < 0) goto onError; *buffer = pp; *buffer_len = len; return 0; onError: return -1; }
PyObject * PyObject_GetItem(PyObject *o, PyObject *key) { PyMappingMethods *m; if (o == NULL || key == NULL) return null_error(); m = o->ob_type->tp_as_mapping; if (m && m->mp_subscript) return m->mp_subscript(o, key); if (o->ob_type->tp_as_sequence) { if (PyInt_Check(key)) return PySequence_GetItem(o, PyInt_AsLong(key)); else if (PyLong_Check(key)) { long key_value = PyLong_AsLong(key); if (key_value == -1 && PyErr_Occurred()) return NULL; return PySequence_GetItem(o, key_value); } return type_error("sequence index must be integer"); } return type_error("unsubscriptable object"); }
PyObject * PyNumber_Long(PyObject *o) { PyNumberMethods *m; const char *buffer; int buffer_len; if (o == NULL) return null_error(); if (PyLong_Check(o)) { Py_INCREF(o); return o; } if (PyString_Check(o)) /* need to do extra error checking that PyLong_FromString() * doesn't do. In particular long('9.5') must raise an * exception, not truncate the float. */ return long_from_string(PyString_AS_STRING(o), PyString_GET_SIZE(o)); if (PyUnicode_Check(o)) /* The above check is done in PyLong_FromUnicode(). */ return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o), PyUnicode_GET_SIZE(o), 10); m = o->ob_type->tp_as_number; if (m && m->nb_long) return m->nb_long(o); if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len)) return long_from_string(buffer, buffer_len); return type_error("object can't be converted to long"); }
PyObject * PySequence_GetSlice(PyObject *s, int i1, int i2) { PySequenceMethods *m; if (!s) return null_error(); m = s->ob_type->tp_as_sequence; if (m && m->sq_slice) { if (i1 < 0 || i2 < 0) { if (m->sq_length) { int l = (*m->sq_length)(s); if (l < 0) return NULL; if (i1 < 0) i1 += l; if (i2 < 0) i2 += l; } } return m->sq_slice(s, i1, i2); } return type_error("unsliceable object"); }
int PyObject_DelItem(PyObject *o, PyObject *key) { PyMappingMethods *m; if (o == NULL || key == NULL) { null_error(); return -1; } m = o->ob_type->tp_as_mapping; if (m && m->mp_ass_subscript) return m->mp_ass_subscript(o, key, (PyObject*)NULL); if (o->ob_type->tp_as_sequence) { if (PyInt_Check(key)) return PySequence_DelItem(o, PyInt_AsLong(key)); else if (PyLong_Check(key)) { long key_value = PyLong_AsLong(key); if (key_value == -1 && PyErr_Occurred()) return -1; return PySequence_DelItem(o, key_value); } type_error("sequence index must be integer"); return -1; } type_error("object does not support item deletion"); return -1; }
int PySequence_DelItem(PyObject *s, int i) { PySequenceMethods *m; if (s == NULL) { null_error(); return -1; } m = s->ob_type->tp_as_sequence; if (m && m->sq_ass_item) { if (i < 0) { if (m->sq_length) { int l = (*m->sq_length)(s); if (l < 0) return -1; i += l; } } return m->sq_ass_item(s, i, (PyObject *)NULL); } type_error("object doesn't support item deletion"); return -1; }
int PySequence_SetItem(PyObject *s, int i, PyObject *o) { PySequenceMethods *m; if (s == NULL) { null_error(); return -1; } m = s->ob_type->tp_as_sequence; if (m && m->sq_ass_item) { if (i < 0) { if (m->sq_length) { int l = (*m->sq_length)(s); if (l < 0) return -1; i += l; } } return m->sq_ass_item(s, i, o); } type_error("object doesn't support item assignment"); return -1; }
int PySequence_Index(PyObject *s, PyObject *o) { int l, i, cmp, err; PyObject *item; if (s == NULL || o == NULL) { null_error(); return -1; } l = PySequence_Size(s); if (l < 0) return -1; for (i = 0; i < l; i++) { item = PySequence_GetItem(s, i); if (item == NULL) return -1; err = PyObject_Cmp(item, o, &cmp); Py_DECREF(item); if (err < 0) return err; if (cmp == 0) return i; } PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list"); return -1; }
int PySequence_Count(PyObject *s, PyObject *o) { int l, i, n, cmp, err; PyObject *item; if (s == NULL || o == NULL) { null_error(); return -1; } l = PySequence_Size(s); if (l < 0) return -1; n = 0; for (i = 0; i < l; i++) { item = PySequence_GetItem(s, i); if (item == NULL) return -1; err = PyObject_Cmp(item, o, &cmp); Py_DECREF(item); if (err < 0) return err; if (cmp == 0) n++; } return n; }
int PySequence_DelSlice(PyObject *s, int i1, int i2) { PySequenceMethods *m; if (s == NULL) { null_error(); return -1; } m = s->ob_type->tp_as_sequence; if (m && m->sq_ass_slice) { if (i1 < 0 || i2 < 0) { if (m->sq_length) { int l = (*m->sq_length)(s); if (l < 0) return -1; if (i1 < 0) i1 += l; if (i2 < 0) i2 += l; } } return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL); } type_error("object doesn't support slice deletion"); return -1; }
PyObject * PyNumber_Int(PyObject *o) { PyNumberMethods *m; const char *buffer; int buffer_len; if (o == NULL) return null_error(); if (PyInt_Check(o)) { Py_INCREF(o); return o; } if (PyString_Check(o)) return int_from_string(PyString_AS_STRING(o), PyString_GET_SIZE(o)); if (PyUnicode_Check(o)) return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o), PyUnicode_GET_SIZE(o), 10); m = o->ob_type->tp_as_number; if (m && m->nb_int) return m->nb_int(o); if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len)) return int_from_string((char*)buffer, buffer_len); return type_error("object can't be converted to int"); }
int _zbar_processor_open (zbar_processor_t *proc, char *name, unsigned w, unsigned h) { return(null_error(proc, __func__)); }
PyObject * PySequence_Tuple(PyObject *v) { PySequenceMethods *m; if (v == NULL) return null_error(); if (PyTuple_Check(v)) { Py_INCREF(v); return v; } if (PyList_Check(v)) return PyList_AsTuple(v); /* There used to be code for strings here, but tuplifying strings is not a common activity, so I nuked it. Down with code bloat! */ /* Generic sequence object */ m = v->ob_type->tp_as_sequence; if (m && m->sq_item) { int i; PyObject *t; int n = PySequence_Size(v); if (n < 0) return NULL; t = PyTuple_New(n); if (t == NULL) return NULL; for (i = 0; ; i++) { PyObject *item = (*m->sq_item)(v, i); if (item == NULL) { if (PyErr_ExceptionMatches(PyExc_IndexError)) PyErr_Clear(); else { Py_DECREF(t); t = NULL; } break; } if (i >= n) { if (n < 500) n += 10; else n += 100; if (_PyTuple_Resize(&t, n, 0) != 0) break; } PyTuple_SET_ITEM(t, i, item); } if (i < n && t != NULL) _PyTuple_Resize(&t, i, 0); return t; } /* None of the above */ return type_error("tuple() argument must be a sequence"); }
PyObject * PyObject_Type(PyObject *o) { PyObject *v; if (o == NULL) return null_error(); v = (PyObject *)o->ob_type; Py_INCREF(v); return v; }
PyObject * PyObject_CallMethod(PyObject *o, char *name, char *format, ...) { va_list va; PyObject *args, *func = 0, *retval; va_start(va, format); if (o == NULL || name == NULL) { va_end(va); return null_error(); } func = PyObject_GetAttrString(o, name); if (func == NULL) { va_end(va); PyErr_SetString(PyExc_AttributeError, name); return 0; } if (!PyCallable_Check(func)) { va_end(va); return type_error("call of non-callable attribute"); } if (format && *format) args = Py_VaBuildValue(format, va); else args = PyTuple_New(0); va_end(va); if (!args) return NULL; if (!PyTuple_Check(args)) { PyObject *a; a = PyTuple_New(1); if (a == NULL) return NULL; if (PyTuple_SetItem(a, 0, args) < 0) return NULL; args = a; } retval = PyObject_CallObject(func, args); Py_DECREF(args); Py_DECREF(func); return retval; }
PyObject * PyNumber_Invert(PyObject *o) { PyNumberMethods *m; if (o == NULL) return null_error(); m = o->ob_type->tp_as_number; if (m && m->nb_invert) return (*m->nb_invert)(o); return type_error("bad operand type for unary ~"); }
PyObject * PyNumber_Absolute(PyObject *o) { PyNumberMethods *m; if (o == NULL) return null_error(); m = o->ob_type->tp_as_number; if (m && m->nb_absolute) return m->nb_absolute(o); return type_error("bad operand type for abs()"); }
PyObject * PyNumber_Positive(PyObject *o) { PyNumberMethods *m; if (o == NULL) return null_error(); m = o->ob_type->tp_as_number; if (m && m->nb_positive) return (*m->nb_positive)(o); return type_error("bad operand type for unary +"); }
PyObject * PySequence_Concat(PyObject *s, PyObject *o) { PySequenceMethods *m; if (s == NULL || o == NULL) return null_error(); m = s->ob_type->tp_as_sequence; if (m && m->sq_concat) return m->sq_concat(s, o); return type_error("object can't be concatenated"); }
PyObject * PySequence_Repeat(PyObject *o, int count) { PySequenceMethods *m; if (o == NULL) return null_error(); m = o->ob_type->tp_as_sequence; if (m && m->sq_repeat) return m->sq_repeat(o, count); return type_error("object can't be repeated"); }
PyObject * PySequence_List(PyObject *v) { PySequenceMethods *m; if (v == NULL) return null_error(); if (PyList_Check(v)) return PyList_GetSlice(v, 0, PyList_GET_SIZE(v)); m = v->ob_type->tp_as_sequence; if (m && m->sq_item) { int i; PyObject *l; int n = PySequence_Size(v); if (n < 0) return NULL; l = PyList_New(n); if (l == NULL) return NULL; for (i = 0; ; i++) { PyObject *item = (*m->sq_item)(v, i); if (item == NULL) { if (PyErr_ExceptionMatches(PyExc_IndexError)) PyErr_Clear(); else { Py_DECREF(l); l = NULL; } break; } if (i < n) PyList_SET_ITEM(l, i, item); else if (PyList_Append(l, item) < 0) { Py_DECREF(l); l = NULL; break; } } if (i < n && l != NULL) { if (PyList_SetSlice(l, i, n, (PyObject *)NULL) != 0) { Py_DECREF(l); l = NULL; } } return l; } return type_error("list() argument must be a sequence"); }
PyObject * PyMapping_GetItemString(PyObject *o, char *key) { PyObject *okey, *r; if (key == NULL) return null_error(); okey = PyString_FromString(key); if (okey == NULL) return NULL; r = PyObject_GetItem(o, okey); Py_DECREF(okey); return r; }
int PyObject_Cmp(PyObject *o1, PyObject *o2, int *result) { int r; if (o1 == NULL || o2 == NULL) { null_error(); return -1; } r = PyObject_Compare(o1, o2); if (PyErr_Occurred()) return -1; *result = r; return 0; }
int PyObject_Size(PyObject *o) { PySequenceMethods *m; if (o == NULL) { null_error(); return -1; } m = o->ob_type->tp_as_sequence; if (m && m->sq_length) return m->sq_length(o); return PyMapping_Size(o); }
PyObject * PySequence_Fast(PyObject *v, const char *m) { if (v == NULL) return null_error(); if (PyList_Check(v) || PyTuple_Check(v)) { Py_INCREF(v); return v; } v = PySequence_Tuple(v); if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError)) return type_error(m); return v; }
int PyMapping_Size(PyObject *o) { PyMappingMethods *m; if (o == NULL) { null_error(); return -1; } m = o->ob_type->tp_as_mapping; if (m && m->mp_length) return m->mp_length(o); type_error("len() of unsized object"); return -1; }
int PySequence_Size(PyObject *s) { PySequenceMethods *m; if (s == NULL) { null_error(); return -1; } m = s->ob_type->tp_as_sequence; if (m && m->sq_length) return m->sq_length(s); type_error("len() of unsized object"); return -1; }
int PyMapping_SetItemString(PyObject *o, char *key, PyObject *value) { PyObject *okey; int r; if (key == NULL) { null_error(); return -1; } okey = PyString_FromString(key); if (okey == NULL) return -1; r = PyObject_SetItem(o, okey, value); Py_DECREF(okey); return r; }
PyObject * PyNumber_Float(PyObject *o) { PyNumberMethods *m; if (o == NULL) return null_error(); if (PyFloat_Check(o)) { Py_INCREF(o); return o; } if (!PyString_Check(o)) { m = o->ob_type->tp_as_number; if (m && m->nb_float) return m->nb_float(o); } return PyFloat_FromString(o, NULL); }
PyObject * PyObject_CallFunction(PyObject *callable, char *format, ...) { va_list va; PyObject *args, *retval; va_start(va, format); if (callable == NULL) { va_end(va); return null_error(); } if (format) args = Py_VaBuildValue(format, va); else args = PyTuple_New(0); va_end(va); if (args == NULL) return NULL; if (!PyTuple_Check(args)) { PyObject *a; a = PyTuple_New(1); if (a == NULL) return NULL; if (PyTuple_SetItem(a, 0, args) < 0) return NULL; args = a; } retval = PyObject_CallObject(callable, args); Py_DECREF(args); return retval; }