diff options
author | Jeremy Hylton <jeremy@alum.mit.edu> | 2001-11-09 21:59:42 (GMT) |
---|---|---|
committer | Jeremy Hylton <jeremy@alum.mit.edu> | 2001-11-09 21:59:42 (GMT) |
commit | 89c3a22a2788cb85b89990543e33236cd60ba307 (patch) | |
tree | c7da0d69ab040e3e3f3f5b94752bf182d7b205c9 /Objects/abstract.c | |
parent | da4ffeecf5106250ce1cb184b22f0c7e691e9f74 (diff) | |
download | cpython-89c3a22a2788cb85b89990543e33236cd60ba307.zip cpython-89c3a22a2788cb85b89990543e33236cd60ba307.tar.gz cpython-89c3a22a2788cb85b89990543e33236cd60ba307.tar.bz2 |
Add PyObject_CheckReadBuffer(), which returns true if its argument
supports the single-segment readable buffer interface.
Add documentation for this and other PyObject_XXXBuffer() calls.
Diffstat (limited to 'Objects/abstract.c')
-rw-r--r-- | Objects/abstract.c | 64 |
1 files changed, 35 insertions, 29 deletions
diff --git a/Objects/abstract.c b/Objects/abstract.c index 938c2e2..0856f19 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -182,27 +182,37 @@ int PyObject_AsCharBuffer(PyObject *obj, return -1; } pb = obj->ob_type->tp_as_buffer; - if ( pb == NULL || + if (pb == NULL || pb->bf_getcharbuffer == NULL || - pb->bf_getsegcount == NULL ) { + pb->bf_getsegcount == NULL) { PyErr_SetString(PyExc_TypeError, "expected a character buffer object"); - goto onError; + return -1; } - if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) { + if ((*pb->bf_getsegcount)(obj,NULL) != 1) { PyErr_SetString(PyExc_TypeError, "expected a single-segment buffer object"); - goto onError; + return -1; } - len = (*pb->bf_getcharbuffer)(obj,0,&pp); + len = (*pb->bf_getcharbuffer)(obj, 0, &pp); if (len < 0) - goto onError; + return -1; *buffer = pp; *buffer_len = len; return 0; +} - onError: - return -1; +int +PyObject_CheckReadBuffer(PyObject *obj) +{ + PyBufferProcs *pb = obj->ob_type->tp_as_buffer; + + if (pb == NULL || + pb->bf_getreadbuffer == NULL || + pb->bf_getsegcount == NULL || + (*pb->bf_getsegcount)(obj, NULL) != 1) + return 0; + return 1; } int PyObject_AsReadBuffer(PyObject *obj, @@ -218,27 +228,24 @@ int PyObject_AsReadBuffer(PyObject *obj, return -1; } pb = obj->ob_type->tp_as_buffer; - if ( pb == NULL || + if (pb == NULL || pb->bf_getreadbuffer == NULL || - pb->bf_getsegcount == NULL ) { + pb->bf_getsegcount == NULL) { PyErr_SetString(PyExc_TypeError, "expected a readable buffer object"); - goto onError; + return -1; } - if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) { + if ((*pb->bf_getsegcount)(obj, NULL) != 1) { PyErr_SetString(PyExc_TypeError, "expected a single-segment buffer object"); - goto onError; + return -1; } - len = (*pb->bf_getreadbuffer)(obj,0,&pp); + len = (*pb->bf_getreadbuffer)(obj, 0, &pp); if (len < 0) - goto onError; + return -1; *buffer = pp; *buffer_len = len; return 0; - - onError: - return -1; } int PyObject_AsWriteBuffer(PyObject *obj, @@ -254,27 +261,24 @@ int PyObject_AsWriteBuffer(PyObject *obj, return -1; } pb = obj->ob_type->tp_as_buffer; - if ( pb == NULL || + if (pb == NULL || pb->bf_getwritebuffer == NULL || - pb->bf_getsegcount == NULL ) { + pb->bf_getsegcount == NULL) { PyErr_SetString(PyExc_TypeError, "expected a writeable buffer object"); - goto onError; + return -1; } - if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) { + if ((*pb->bf_getsegcount)(obj, NULL) != 1) { PyErr_SetString(PyExc_TypeError, "expected a single-segment buffer object"); - goto onError; + return -1; } len = (*pb->bf_getwritebuffer)(obj,0,&pp); if (len < 0) - goto onError; + return -1; *buffer = pp; *buffer_len = len; return 0; - - onError: - return -1; } /* Operations on numbers */ @@ -1980,7 +1984,8 @@ PyObject_GetIter(PyObject *o) if (f == NULL) { if (PySequence_Check(o)) return PySeqIter_New(o); - PyErr_SetString(PyExc_TypeError, "iteration over non-sequence"); + PyErr_SetString(PyExc_TypeError, + "iteration over non-sequence"); return NULL; } else { @@ -2021,3 +2026,4 @@ PyIter_Next(PyObject *iter) PyErr_Clear(); return result; } + |