bufferobject.c revision 4252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8
12e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
22e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum/* Buffer object implementation */
32e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
42e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum#include "Python.h"
52e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
62e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
72e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumtypedef struct {
82e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	PyObject_HEAD
92e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	PyObject *b_base;
102e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	void *b_ptr;
112e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	int b_size;
124252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	int b_offset;
132e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	int b_readonly;
142e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	long b_hash;
152e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum} PyBufferObject;
162e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
172e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
184252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauerstatic int
194252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauerget_buf(PyBufferObject *self, void **ptr, int *size)
204252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer{
214252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	if (self->b_base == NULL) {
224252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		assert (ptr != NULL);
234252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		*ptr = self->b_ptr;
244252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		*size = self->b_size;
254252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	}
264252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	else {
274252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		int count, offset;
284252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		getreadbufferproc proc;
294252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		PyBufferProcs *bp = self->b_base->ob_type->tp_as_buffer;
304252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		if ((*bp->bf_getsegcount)(self->b_base, NULL) != 1) {
314252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer			PyErr_SetString(PyExc_TypeError,
324252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer				"single-segment buffer object expected");
334252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer			return 0;
344252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		}
354252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		if (self->b_readonly)
364252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer			proc = bp->bf_getreadbuffer;
374252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		else
384252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer			proc = (getreadbufferproc)bp->bf_getwritebuffer;
394252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		if ((count = (*proc)(self->b_base, 0, ptr)) < 0)
404252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer			return 0;
414252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		/* apply constraints to the start/end */
424252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		if (self->b_offset > count)
434252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer			offset = count;
444252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		else
454252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer			offset = self->b_offset;
464252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		(char *)*ptr = (char *)*ptr + offset;
474252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		if (self->b_size == Py_END_OF_BUFFER)
484252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer			*size = count;
494252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		else
504252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer			*size = self->b_size;
514252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		if (offset + *size > count)
524252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer			*size = count - offset;
534252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	}
544252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	return 1;
554252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer}
564252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer
574252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer
582e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic PyObject *
594252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauerbuffer_from_memory(PyObject *base, int size, int offset, void *ptr,
604252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		   int readonly)
612e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{
622e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	PyBufferObject * b;
632e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
644252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	if (size < 0 && size != Py_END_OF_BUFFER) {
6549ded3ec004c49088ec26c808f9b7c931a35cf0fGuido van Rossum		PyErr_SetString(PyExc_ValueError,
6649ded3ec004c49088ec26c808f9b7c931a35cf0fGuido van Rossum				"size must be zero or positive");
6749ded3ec004c49088ec26c808f9b7c931a35cf0fGuido van Rossum		return NULL;
6849ded3ec004c49088ec26c808f9b7c931a35cf0fGuido van Rossum	}
6949ded3ec004c49088ec26c808f9b7c931a35cf0fGuido van Rossum
702e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	b = PyObject_NEW(PyBufferObject, &PyBuffer_Type);
712e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if ( b == NULL )
722e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		return NULL;
732e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
742e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	Py_XINCREF(base);
752e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	b->b_base = base;
762e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	b->b_ptr = ptr;
772e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	b->b_size = size;
784252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	b->b_offset = offset;
792e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	b->b_readonly = readonly;
802e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	b->b_hash = -1;
812e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
822e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	return (PyObject *) b;
832e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum}
842e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
852e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic PyObject *
864252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauerbuffer_from_object(PyObject *base, int size, int offset, int readonly)
872e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{
8849ded3ec004c49088ec26c808f9b7c931a35cf0fGuido van Rossum	if ( offset < 0 ) {
8949ded3ec004c49088ec26c808f9b7c931a35cf0fGuido van Rossum		PyErr_SetString(PyExc_ValueError,
9049ded3ec004c49088ec26c808f9b7c931a35cf0fGuido van Rossum				"offset must be zero or positive");
9149ded3ec004c49088ec26c808f9b7c931a35cf0fGuido van Rossum		return NULL;
9249ded3ec004c49088ec26c808f9b7c931a35cf0fGuido van Rossum	}
9349ded3ec004c49088ec26c808f9b7c931a35cf0fGuido van Rossum
944252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	/* if the base object is another buffer, then try to refer to the
954252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	 * base object.
96fdc1bd305bcf8d6ebefe98313fa6c310623a0cb9Thomas Heller	 */
974252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	if ( PyBuffer_Check(base) && (((PyBufferObject *)base)->b_base) ) {
982e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		base = ((PyBufferObject *)base)->b_base;
994252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		offset = ((PyBufferObject *)base)->b_offset + offset;
1004252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	}
101fdc1bd305bcf8d6ebefe98313fa6c310623a0cb9Thomas Heller
1024252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	return buffer_from_memory(base, size, offset, NULL, readonly);
1032e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum}
1042e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
1052e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
1062e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van RossumPyObject *
107799124718ddfbb95440470037d8d7760b821646fFred DrakePyBuffer_FromObject(PyObject *base, int offset, int size)
1082e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{
1092e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	PyBufferProcs *pb = base->ob_type->tp_as_buffer;
1102e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
1112e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if ( pb == NULL ||
1122e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	     pb->bf_getreadbuffer == NULL ||
1132e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	     pb->bf_getsegcount == NULL )
1142e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	{
1152e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		PyErr_SetString(PyExc_TypeError, "buffer object expected");
1162e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		return NULL;
1172e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	}
1182e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
1194252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	return buffer_from_object(base, size, offset, 1);
1202e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum}
1212e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
1222e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van RossumPyObject *
123799124718ddfbb95440470037d8d7760b821646fFred DrakePyBuffer_FromReadWriteObject(PyObject *base, int offset, int size)
1242e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{
1252e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	PyBufferProcs *pb = base->ob_type->tp_as_buffer;
1262e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
1272e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if ( pb == NULL ||
1282e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	     pb->bf_getwritebuffer == NULL ||
1292e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	     pb->bf_getsegcount == NULL )
1302e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	{
1312e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		PyErr_SetString(PyExc_TypeError, "buffer object expected");
1322e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		return NULL;
1332e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	}
1342e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
1354252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	return buffer_from_object(base, size,  offset, 0);
1362e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum}
1372e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
1382e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van RossumPyObject *
139799124718ddfbb95440470037d8d7760b821646fFred DrakePyBuffer_FromMemory(void *ptr, int size)
1402e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{
1414252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	return buffer_from_memory(NULL, size, 0, ptr, 1);
1422e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum}
1432e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
1442e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van RossumPyObject *
145799124718ddfbb95440470037d8d7760b821646fFred DrakePyBuffer_FromReadWriteMemory(void *ptr, int size)
1462e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{
1474252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	return buffer_from_memory(NULL, size, 0, ptr, 0);
1482e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum}
1492e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
1502e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van RossumPyObject *
151799124718ddfbb95440470037d8d7760b821646fFred DrakePyBuffer_New(int size)
1522e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{
153cf703f04ad406d905d280a364048d56aa9d21315Moshe Zadka	PyObject *o;
1542e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	PyBufferObject * b;
1552e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
1564574f23115e2c0b35a2e1a4cac0aa7c855144639Fred Drake	if (size < 0) {
1574574f23115e2c0b35a2e1a4cac0aa7c855144639Fred Drake		PyErr_SetString(PyExc_ValueError,
1584574f23115e2c0b35a2e1a4cac0aa7c855144639Fred Drake				"size must be zero or positive");
1594574f23115e2c0b35a2e1a4cac0aa7c855144639Fred Drake		return NULL;
1604574f23115e2c0b35a2e1a4cac0aa7c855144639Fred Drake	}
161e3a8e7ed1d221e5c19d0b3cd9796b393bc41dc68Guido van Rossum	/* Inline PyObject_New */
162cf703f04ad406d905d280a364048d56aa9d21315Moshe Zadka	o = PyObject_MALLOC(sizeof(*b) + size);
163cf703f04ad406d905d280a364048d56aa9d21315Moshe Zadka	if ( o == NULL )
1644574f23115e2c0b35a2e1a4cac0aa7c855144639Fred Drake		return PyErr_NoMemory();
165cf703f04ad406d905d280a364048d56aa9d21315Moshe Zadka	b = (PyBufferObject *) PyObject_INIT(o, &PyBuffer_Type);
1662e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
1672e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	b->b_base = NULL;
1682e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	b->b_ptr = (void *)(b + 1);
1692e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	b->b_size = size;
1704252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	b->b_offset = 0;
1712e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	b->b_readonly = 0;
1722e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	b->b_hash = -1;
1732e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
174cf703f04ad406d905d280a364048d56aa9d21315Moshe Zadka	return o;
1752e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum}
1762e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
1772e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum/* Methods */
1782e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
179bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossumstatic PyObject *
180bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossumbuffer_new(PyTypeObject *type, PyObject *args, PyObject *kw)
181bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum{
182bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum	PyObject *ob;
183bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum	int offset = 0;
184bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum	int size = Py_END_OF_BUFFER;
185bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum
186bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum	if ( !PyArg_ParseTuple(args, "O|ii:buffer", &ob, &offset, &size) )
187bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum	    return NULL;
188bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum	return PyBuffer_FromObject(ob, offset, size);
189bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum}
190bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum
191bea18ccde6bc12e061c21bb6b944379d8b123845Guido van RossumPyDoc_STRVAR(buffer_doc,
192bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum"buffer(object [, offset[, size]])\n\
193bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum\n\
194bea18ccde6bc12e061c21bb6b944379d8b123845Guido van RossumCreate a new buffer object which references the given object.\n\
195bea18ccde6bc12e061c21bb6b944379d8b123845Guido van RossumThe buffer will reference a slice of the target object from the\n\
196bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossumstart of the object (or at the specified offset). The slice will\n\
197bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossumextend to the end of the target object (or with the specified size).");
198bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum
199bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum
2002e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic void
201799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_dealloc(PyBufferObject *self)
2022e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{
2032e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	Py_XDECREF(self->b_base);
204b18618dab7b6b85bb05b084693706e59211fa180Guido van Rossum	PyObject_DEL(self);
2052e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum}
2062e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
2072e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic int
208799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_compare(PyBufferObject *self, PyBufferObject *other)
2092e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{
2104252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	void *p1, *p2;
2114252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	int len_self, len_other, min_len, cmp;
2124252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer
2134252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	if (!get_buf(self, &p1, &len_self))
2144252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		return -1;
2154252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	if (!get_buf(other, &p2, &len_other))
2164252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		return -1;
2174252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	min_len = (len_self < len_other) ? len_self : len_other;
2182e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if (min_len > 0) {
2194252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		cmp = memcmp(p1, p2, min_len);
2202e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		if (cmp != 0)
2212e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum			return cmp;
2222e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	}
2232e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	return (len_self < len_other) ? -1 : (len_self > len_other) ? 1 : 0;
2242e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum}
2252e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
2262e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic PyObject *
227799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_repr(PyBufferObject *self)
2282e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{
2292e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	char *status = self->b_readonly ? "read-only" : "read-write";
2302e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
2312e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if ( self->b_base == NULL )
2327ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw		return PyString_FromFormat("<%s buffer ptr %p, size %d at %p>",
2337ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw					   status,
2347ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw					   self->b_ptr,
2357ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw					   self->b_size,
2367ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw					   self);
2372e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	else
2387ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw		return PyString_FromFormat(
2394252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer			"<%s buffer for %p, size %d, offset %d at %p>",
2402e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum			status,
241a44d353e2b6d947d36ab9d36c1fc84335a0878feFred Drake			self->b_base,
2422e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum			self->b_size,
2434252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer			self->b_offset,
244a44d353e2b6d947d36ab9d36c1fc84335a0878feFred Drake			self);
2452e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum}
2462e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
2472e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic long
248799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_hash(PyBufferObject *self)
2492e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{
2504252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	void *ptr;
2514252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	int size;
2522e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	register int len;
2532e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	register unsigned char *p;
2542e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	register long x;
2552e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
2562e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if ( self->b_hash != -1 )
2572e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		return self->b_hash;
2582e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
2590eadcd9cbbc3e165f046fa01025e2a76084a8e52Neil Schemenauer	/* XXX potential bugs here, a readonly buffer does not imply that the
2600eadcd9cbbc3e165f046fa01025e2a76084a8e52Neil Schemenauer	 * underlying memory is immutable.  b_readonly is a necessary but not
2610eadcd9cbbc3e165f046fa01025e2a76084a8e52Neil Schemenauer	 * sufficient condition for a buffer to be hashable.  Perhaps it would
2620eadcd9cbbc3e165f046fa01025e2a76084a8e52Neil Schemenauer	 * be better to only allow hashing if the underlying object is known to
2630eadcd9cbbc3e165f046fa01025e2a76084a8e52Neil Schemenauer	 * be immutable (e.g. PyString_Check() is true).  Another idea would
2640eadcd9cbbc3e165f046fa01025e2a76084a8e52Neil Schemenauer	 * be to call tp_hash on the underlying object and see if it raises
2650eadcd9cbbc3e165f046fa01025e2a76084a8e52Neil Schemenauer	 * an error. */
2662e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if ( !self->b_readonly )
2672e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	{
2680eadcd9cbbc3e165f046fa01025e2a76084a8e52Neil Schemenauer		PyErr_SetString(PyExc_TypeError,
2690eadcd9cbbc3e165f046fa01025e2a76084a8e52Neil Schemenauer				"writable buffers are not hashable");
2702e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		return -1;
2712e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	}
2722e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
2734252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	if (!get_buf(self, &ptr, &size))
2744252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		return -1;
2754252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	p = (unsigned char *) ptr;
2764252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	len = size;
2772e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	x = *p << 7;
2782e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	while (--len >= 0)
2792e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		x = (1000003*x) ^ *p++;
2804252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	x ^= size;
2812e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if (x == -1)
2822e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		x = -2;
2832e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	self->b_hash = x;
2842e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	return x;
2852e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum}
2862e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
2872e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic PyObject *
288799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_str(PyBufferObject *self)
2892e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{
2904252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	void *ptr;
2914252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	int size;
2924252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	if (!get_buf(self, &ptr, &size))
2934252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		return NULL;
2944252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	return PyString_FromStringAndSize(ptr, size);
2952e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum}
2962e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
2972e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum/* Sequence methods */
2982e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
2992e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic int
300799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_length(PyBufferObject *self)
3012e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{
3024252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	void *ptr;
3034252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	int size;
3044252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	if (!get_buf(self, &ptr, &size))
3054252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		return -1;
3064252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	return size;
3072e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum}
3082e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
3092e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic PyObject *
310799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_concat(PyBufferObject *self, PyObject *other)
3112e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{
3122e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	PyBufferProcs *pb = other->ob_type->tp_as_buffer;
3134252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	void *ptr1, *ptr2;
3144252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	char *p;
3152e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	PyObject *ob;
3164252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	int size, count;
3172e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
3182e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if ( pb == NULL ||
3192e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	     pb->bf_getreadbuffer == NULL ||
3202e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	     pb->bf_getsegcount == NULL )
3212e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	{
3222e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		PyErr_BadArgument();
3232e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		return NULL;
3242e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	}
3252e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if ( (*pb->bf_getsegcount)(other, NULL) != 1 )
3262e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	{
3272e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		/* ### use a different exception type/message? */
328cd037e7bed8535f11df4be01c040b939c9e2ad60Guido van Rossum		PyErr_SetString(PyExc_TypeError,
329cd037e7bed8535f11df4be01c040b939c9e2ad60Guido van Rossum				"single-segment buffer object expected");
3302e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		return NULL;
3312e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	}
3322e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
3334252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer 	if (!get_buf(self, &ptr1, &size))
3344252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer 		return NULL;
3354252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer
3362e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	/* optimize special case */
3374252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	if ( size == 0 )
3382e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	{
3392e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	    Py_INCREF(other);
3402e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	    return other;
3412e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	}
3422e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
3434252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	if ( (count = (*pb->bf_getreadbuffer)(other, 0, &ptr2)) < 0 )
3442e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		return NULL;
3452e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
3464252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer 	ob = PyString_FromStringAndSize(NULL, size + count);
3474252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer 	p = PyString_AS_STRING(ob);
3484252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer 	memcpy(p, ptr1, size);
3494252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer 	memcpy(p + size, ptr2, count);
3502e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
3512e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	/* there is an extra byte in the string object, so this is safe */
3524252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	p[size + count] = '\0';
3532e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
3542e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	return ob;
3552e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum}
3562e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
3572e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic PyObject *
358799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_repeat(PyBufferObject *self, int count)
3592e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{
3602e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	PyObject *ob;
3612e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	register char *p;
3624252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	void *ptr;
3634252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	int size;
3642e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
3652e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if ( count < 0 )
3662e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		count = 0;
3674252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	if (!get_buf(self, &ptr, &size))
3684252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		return NULL;
3692e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	ob = PyString_FromStringAndSize(NULL, size * count);
3702e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if ( ob == NULL )
3712e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		return NULL;
3722e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
3732e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	p = PyString_AS_STRING(ob);
3742e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	while ( count-- )
3752e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	{
3762e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	    memcpy(p, ptr, size);
3772e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	    p += size;
3782e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	}
3792e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
3802e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	/* there is an extra byte in the string object, so this is safe */
3812e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	*p = '\0';
3822e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
3832e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	return ob;
3842e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum}
3852e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
3862e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic PyObject *
387799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_item(PyBufferObject *self, int idx)
3882e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{
3894252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	void *ptr;
3904252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	int size;
3914252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	if (!get_buf(self, &ptr, &size))
3924252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		return NULL;
3934252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	if ( idx < 0 || idx >= size ) {
3942e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		PyErr_SetString(PyExc_IndexError, "buffer index out of range");
3952e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		return NULL;
3962e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	}
3974252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	return PyString_FromStringAndSize((char *)ptr + idx, 1);
3982e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum}
3992e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
4002e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic PyObject *
401799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_slice(PyBufferObject *self, int left, int right)
4022e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{
4034252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	void *ptr;
4044252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	int size;
4054252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	if (!get_buf(self, &ptr, &size))
4064252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		return NULL;
4072e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if ( left < 0 )
4082e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		left = 0;
4092e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if ( right < 0 )
4102e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		right = 0;
4114252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	if ( right > size )
4124252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		right = size;
4132e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if ( right < left )
4142e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		right = left;
4154252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	return PyString_FromStringAndSize((char *)ptr + left,
416cd037e7bed8535f11df4be01c040b939c9e2ad60Guido van Rossum					  right - left);
4172e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum}
4182e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
4192e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic int
420799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_ass_item(PyBufferObject *self, int idx, PyObject *other)
4212e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{
4222e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	PyBufferProcs *pb;
4234252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	void *ptr1, *ptr2;
4244252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	int size;
4252e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	int count;
4262e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
4272e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if ( self->b_readonly ) {
4282e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		PyErr_SetString(PyExc_TypeError,
4292e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum				"buffer is read-only");
4302e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		return -1;
4312e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	}
4322e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
4334252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	if (!get_buf(self, &ptr1, &size))
4344252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		return -1;
4354252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer
4364252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	if (idx < 0 || idx >= size) {
4372e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		PyErr_SetString(PyExc_IndexError,
4382e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum				"buffer assignment index out of range");
4392e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		return -1;
4402e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	}
4412e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
4422e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	pb = other ? other->ob_type->tp_as_buffer : NULL;
4432e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if ( pb == NULL ||
4442e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	     pb->bf_getreadbuffer == NULL ||
4452e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	     pb->bf_getsegcount == NULL )
4462e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	{
4472e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		PyErr_BadArgument();
4482e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		return -1;
4492e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	}
4502e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if ( (*pb->bf_getsegcount)(other, NULL) != 1 )
4512e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	{
4522e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		/* ### use a different exception type/message? */
453cd037e7bed8535f11df4be01c040b939c9e2ad60Guido van Rossum		PyErr_SetString(PyExc_TypeError,
454cd037e7bed8535f11df4be01c040b939c9e2ad60Guido van Rossum				"single-segment buffer object expected");
4552e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		return -1;
4562e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	}
4572e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
4584252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	if ( (count = (*pb->bf_getreadbuffer)(other, 0, &ptr2)) < 0 )
4592e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		return -1;
4602e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if ( count != 1 ) {
4612e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		PyErr_SetString(PyExc_TypeError,
4622e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum				"right operand must be a single byte");
4632e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		return -1;
4642e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	}
4652e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
4664252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	((char *)ptr1)[idx] = *(char *)ptr2;
4672e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	return 0;
4682e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum}
4692e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
4702e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic int
471799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_ass_slice(PyBufferObject *self, int left, int right, PyObject *other)
4722e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{
4732e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	PyBufferProcs *pb;
4744252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	void *ptr1, *ptr2;
4754252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	int size;
4762e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	int slice_len;
4772e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	int count;
4782e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
4792e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if ( self->b_readonly ) {
4802e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		PyErr_SetString(PyExc_TypeError,
4812e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum				"buffer is read-only");
4822e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		return -1;
4832e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	}
4842e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
4852e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	pb = other ? other->ob_type->tp_as_buffer : NULL;
4862e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if ( pb == NULL ||
4872e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	     pb->bf_getreadbuffer == NULL ||
4882e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	     pb->bf_getsegcount == NULL )
4892e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	{
4902e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		PyErr_BadArgument();
4912e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		return -1;
4922e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	}
4932e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if ( (*pb->bf_getsegcount)(other, NULL) != 1 )
4942e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	{
4952e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		/* ### use a different exception type/message? */
496cd037e7bed8535f11df4be01c040b939c9e2ad60Guido van Rossum		PyErr_SetString(PyExc_TypeError,
497cd037e7bed8535f11df4be01c040b939c9e2ad60Guido van Rossum				"single-segment buffer object expected");
4982e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		return -1;
4992e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	}
5004252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	if (!get_buf(self, &ptr1, &size))
5014252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		return -1;
5024252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	if ( (count = (*pb->bf_getreadbuffer)(other, 0, &ptr2)) < 0 )
5032e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		return -1;
5042e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
5052e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if ( left < 0 )
5062e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		left = 0;
5074252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	else if ( left > size )
5084252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		left = size;
5092e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if ( right < left )
5102e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		right = left;
5114252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	else if ( right > size )
5124252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		right = size;
5132e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	slice_len = right - left;
5142e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
5152e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if ( count != slice_len ) {
516cd037e7bed8535f11df4be01c040b939c9e2ad60Guido van Rossum		PyErr_SetString(
517cd037e7bed8535f11df4be01c040b939c9e2ad60Guido van Rossum			PyExc_TypeError,
518cd037e7bed8535f11df4be01c040b939c9e2ad60Guido van Rossum			"right operand length must match slice length");
5192e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		return -1;
5202e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	}
5212e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
5222e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if ( slice_len )
5234252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	    memcpy((char *)ptr1 + left, ptr2, slice_len);
5242e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
5252e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	return 0;
5262e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum}
5272e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
5282e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum/* Buffer methods */
5292e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
5302e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic int
531799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_getreadbuf(PyBufferObject *self, int idx, void **pp)
5322e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{
5334252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	int size;
5342e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if ( idx != 0 ) {
5352e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		PyErr_SetString(PyExc_SystemError,
5361db7070217d80f0889aed44ceb1f11a82265b3f0Guido van Rossum				"accessing non-existent buffer segment");
5372e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		return -1;
5382e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	}
5394252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	if (!get_buf(self, pp, &size))
5404252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		return -1;
5414252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	return size;
5422e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum}
5432e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
5442e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic int
545799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_getwritebuf(PyBufferObject *self, int idx, void **pp)
5462e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{
5472e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	if ( self->b_readonly )
5482e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	{
5492e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		PyErr_SetString(PyExc_TypeError, "buffer is read-only");
5502e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum		return -1;
5512e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	}
5522e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	return buffer_getreadbuf(self, idx, pp);
5532e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum}
5542e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
5552e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic int
556799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_getsegcount(PyBufferObject *self, int *lenp)
5572e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{
5584252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	void *ptr;
5594252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	int size;
5604252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	if (!get_buf(self, &ptr, &size))
5614252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		return -1;
5624252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	if (lenp)
5634252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		*lenp = size;
5642e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	return 1;
5652e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum}
5662e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
5671db7070217d80f0889aed44ceb1f11a82265b3f0Guido van Rossumstatic int
568799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_getcharbuf(PyBufferObject *self, int idx, const char **pp)
5691db7070217d80f0889aed44ceb1f11a82265b3f0Guido van Rossum{
5704252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	void *ptr;
5714252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	int size;
5721db7070217d80f0889aed44ceb1f11a82265b3f0Guido van Rossum	if ( idx != 0 ) {
5731db7070217d80f0889aed44ceb1f11a82265b3f0Guido van Rossum		PyErr_SetString(PyExc_SystemError,
5741db7070217d80f0889aed44ceb1f11a82265b3f0Guido van Rossum				"accessing non-existent buffer segment");
5751db7070217d80f0889aed44ceb1f11a82265b3f0Guido van Rossum		return -1;
5761db7070217d80f0889aed44ceb1f11a82265b3f0Guido van Rossum	}
5774252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	if (!get_buf(self, &ptr, &size))
5784252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer		return -1;
5794252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	*pp = (const char *)ptr;
5804252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer	return size;
5811db7070217d80f0889aed44ceb1f11a82265b3f0Guido van Rossum}
5821db7070217d80f0889aed44ceb1f11a82265b3f0Guido van Rossum
5832e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
5842e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic PySequenceMethods buffer_as_sequence = {
5852e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	(inquiry)buffer_length, /*sq_length*/
5862e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	(binaryfunc)buffer_concat, /*sq_concat*/
5872e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	(intargfunc)buffer_repeat, /*sq_repeat*/
5882e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	(intargfunc)buffer_item, /*sq_item*/
5892e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	(intintargfunc)buffer_slice, /*sq_slice*/
5902e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	(intobjargproc)buffer_ass_item, /*sq_ass_item*/
5912e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	(intintobjargproc)buffer_ass_slice, /*sq_ass_slice*/
5922e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum};
5932e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
5942e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic PyBufferProcs buffer_as_buffer = {
5952e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	(getreadbufferproc)buffer_getreadbuf,
5962e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	(getwritebufferproc)buffer_getwritebuf,
5972e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	(getsegcountproc)buffer_getsegcount,
5981db7070217d80f0889aed44ceb1f11a82265b3f0Guido van Rossum	(getcharbufferproc)buffer_getcharbuf,
5992e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum};
6002e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum
6012e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van RossumPyTypeObject PyBuffer_Type = {
6022e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	PyObject_HEAD_INIT(&PyType_Type)
6032e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	0,
6042e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	"buffer",
6052e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	sizeof(PyBufferObject),
6062e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum	0,
6076d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters	(destructor)buffer_dealloc, 		/* tp_dealloc */
6086d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters	0,					/* tp_print */
6096d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters	0,					/* tp_getattr */
6106d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters	0,					/* tp_setattr */
6116d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters	(cmpfunc)buffer_compare,		/* tp_compare */
6126d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters	(reprfunc)buffer_repr,			/* tp_repr */
6136d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters	0,					/* tp_as_number */
6146d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters	&buffer_as_sequence,			/* tp_as_sequence */
6156d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters	0,					/* tp_as_mapping */
6166d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters	(hashfunc)buffer_hash,			/* tp_hash */
6176d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters	0,					/* tp_call */
6186d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters	(reprfunc)buffer_str,			/* tp_str */
6196d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters	PyObject_GenericGetAttr,		/* tp_getattro */
6206d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters	0,					/* tp_setattro */
6216d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters	&buffer_as_buffer,			/* tp_as_buffer */
6226d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters	Py_TPFLAGS_DEFAULT,			/* tp_flags */
623bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum	buffer_doc,				/* tp_doc */
624bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum	0,					/* tp_traverse */
625bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum	0,					/* tp_clear */
626bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum	0,					/* tp_richcompare */
627bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum	0,					/* tp_weaklistoffset */
628bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum	0,					/* tp_iter */
629bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum	0,					/* tp_iternext */
630bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum	0,					/* tp_methods */
631bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum	0,					/* tp_members */
632bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum	0,					/* tp_getset */
633bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum	0,					/* tp_base */
634bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum	0,					/* tp_dict */
635bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum	0,					/* tp_descr_get */
636bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum	0,					/* tp_descr_set */
637bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum	0,					/* tp_dictoffset */
638bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum	0,					/* tp_init */
639bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum	0,					/* tp_alloc */
640bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum	buffer_new,				/* tp_new */
6412e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum};
642