cinap_lenrekadd hg and python4bb9e2215 years agoHistory
706 lines · 15.5 KB · C
RawDownload
	     pb->bf_getsegcount == NULL )	{		PyErr_BadArgument();		return -1;	}	if ( (*pb->bf_getsegcount)(other, NULL) != 1 )	{		/* ### use a different exception type/message? */		PyErr_SetString(PyExc_TypeError,				"single-segment buffer object expected");		return -1;	} 	if ( (count = (*pb->bf_getreadbuffer)(other, 0, &ptr2)) < 0 )		return -1;	if ( count != 1 ) {		PyErr_SetString(PyExc_TypeError,				"right operand must be a single byte");		return -1;	} 	((char *)ptr1)[idx] = *(char *)ptr2;	return 0;} static intbuffer_ass_slice(PyBufferObject *self, Py_ssize_t left, Py_ssize_t right, PyObject *other){	PyBufferProcs *pb;	void *ptr1, *ptr2;	Py_ssize_t size;	Py_ssize_t slice_len;	Py_ssize_t count; 	if ( self->b_readonly ) {		PyErr_SetString(PyExc_TypeError,				"buffer is read-only");		return -1;	} 	pb = other ? other->ob_type->tp_as_buffer : NULL;	if ( pb == NULL ||	     pb->bf_getreadbuffer == NULL ||	     pb->bf_getsegcount == NULL )	{		PyErr_BadArgument();		return -1;	}	if ( (*pb->bf_getsegcount)(other, NULL) != 1 )	{		/* ### use a different exception type/message? */		PyErr_SetString(PyExc_TypeError,				"single-segment buffer object expected");		return -1;	}	if (!get_buf(self, &ptr1, &size, ANY_BUFFER))		return -1;	if ( (count = (*pb->bf_getreadbuffer)(other, 0, &ptr2)) < 0 )		return -1; 	if ( left < 0 )		left = 0;	else if ( left > size )		left = size;	if ( right < left )		right = left;	else if ( right > size )		right = size;	slice_len = right - left; 	if ( count != slice_len ) {		PyErr_SetString(			PyExc_TypeError,			"right operand length must match slice length");		return -1;	} 	if ( slice_len )	    memcpy((char *)ptr1 + left, ptr2, slice_len); 	return 0;} /* Buffer methods */ static Py_ssize_tbuffer_getreadbuf(PyBufferObject *self, Py_ssize_t idx, void **pp){	Py_ssize_t size;	if ( idx != 0 ) {		PyErr_SetString(PyExc_SystemError,				"accessing non-existent buffer segment");		return -1;	}	if (!get_buf(self, pp, &size, READ_BUFFER))		return -1;	return size;} static Py_ssize_tbuffer_getwritebuf(PyBufferObject *self, Py_ssize_t idx, void **pp){	Py_ssize_t size; 	if ( self->b_readonly )	{		PyErr_SetString(PyExc_TypeError, "buffer is read-only");		return -1;	} 	if ( idx != 0 ) {		PyErr_SetString(PyExc_SystemError,				"accessing non-existent buffer segment");		return -1;	}	if (!get_buf(self, pp, &size, WRITE_BUFFER))		return -1;	return size;} static Py_ssize_tbuffer_getsegcount(PyBufferObject *self, Py_ssize_t *lenp){	void *ptr;	Py_ssize_t size;	if (!get_buf(self, &ptr, &size, ANY_BUFFER))		return -1;	if (lenp)		*lenp = size;	return 1;} static Py_ssize_tbuffer_getcharbuf(PyBufferObject *self, Py_ssize_t idx, const char **pp){	void *ptr;	Py_ssize_t size;	if ( idx != 0 ) {		PyErr_SetString(PyExc_SystemError,				"accessing non-existent buffer segment");		return -1;	}	if (!get_buf(self, &ptr, &size, CHAR_BUFFER))		return -1;	*pp = (const char *)ptr;	return size;} static PySequenceMethods buffer_as_sequence = {	(lenfunc)buffer_length, /*sq_length*/	(binaryfunc)buffer_concat, /*sq_concat*/	(ssizeargfunc)buffer_repeat, /*sq_repeat*/	(ssizeargfunc)buffer_item, /*sq_item*/	(ssizessizeargfunc)buffer_slice, /*sq_slice*/	(ssizeobjargproc)buffer_ass_item, /*sq_ass_item*/	(ssizessizeobjargproc)buffer_ass_slice, /*sq_ass_slice*/}; static PyBufferProcs buffer_as_buffer = {	(readbufferproc)buffer_getreadbuf,	(writebufferproc)buffer_getwritebuf,	(segcountproc)buffer_getsegcount,	(charbufferproc)buffer_getcharbuf,}; PyTypeObject PyBuffer_Type = {	PyObject_HEAD_INIT(&PyType_Type)	0,	"buffer",	sizeof(PyBufferObject),	0,	(destructor)buffer_dealloc, 		/* tp_dealloc */	0,					/* tp_print */	0,					/* tp_getattr */	0,					/* tp_setattr */	(cmpfunc)buffer_compare,		/* tp_compare */	(reprfunc)buffer_repr,			/* tp_repr */	0,					/* tp_as_number */	&buffer_as_sequence,			/* tp_as_sequence */	0,					/* tp_as_mapping */	(hashfunc)buffer_hash,			/* tp_hash */	0,					/* tp_call */	(reprfunc)buffer_str,			/* tp_str */	PyObject_GenericGetAttr,		/* tp_getattro */	0,					/* tp_setattro */	&buffer_as_buffer,			/* tp_as_buffer */	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GETCHARBUFFER, /* tp_flags */	buffer_doc,				/* tp_doc */	0,					/* tp_traverse */	0,					/* tp_clear */	0,					/* tp_richcompare */	0,					/* tp_weaklistoffset */	0,					/* tp_iter */	0,					/* tp_iternext */	0,					/* tp_methods */		0,					/* tp_members */	0,					/* tp_getset */	0,					/* tp_base */	0,					/* tp_dict */	0,					/* tp_descr_get */	0,					/* tp_descr_set */	0,					/* tp_dictoffset */	0,					/* tp_init */	0,					/* tp_alloc */	buffer_new,				/* tp_new */};

Lines 501–706 of 706. Previous lines