Change PyBuffer to Py_buffer to be consistent with other non-object structures like Py_complex.  Add some more functionality to the memoryview object.
diff --git a/Objects/abstract.c b/Objects/abstract.c
index 284eb33..141996d 100644
--- a/Objects/abstract.c
+++ b/Objects/abstract.c
@@ -224,7 +224,7 @@
                       Py_ssize_t *buffer_len)
 {
 	PyBufferProcs *pb;
-        PyBuffer view;
+        Py_buffer view;
 
 	if (obj == NULL || buffer == NULL || buffer_len == NULL) {
 		null_error();
@@ -267,7 +267,7 @@
 			  Py_ssize_t *buffer_len)
 {
 	PyBufferProcs *pb;
-        PyBuffer view;
+        Py_buffer view;
 
 	if (obj == NULL || buffer == NULL || buffer_len == NULL) {
 		null_error();
@@ -295,7 +295,7 @@
 			   Py_ssize_t *buffer_len)
 {
 	PyBufferProcs *pb;
-        PyBuffer view;
+        Py_buffer view;
 
 	if (obj == NULL || buffer == NULL || buffer_len == NULL) {
 		null_error();
@@ -320,7 +320,7 @@
 /* Buffer C-API for Python 3.0 */
 
 int
-PyObject_GetBuffer(PyObject *obj, PyBuffer *view, int flags)
+PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
 {
         if (!PyObject_CheckBuffer(obj)) {
                 PyErr_SetString(PyExc_TypeError,
@@ -331,7 +331,7 @@
 }
 
 void
-PyObject_ReleaseBuffer(PyObject *obj, PyBuffer *view)
+PyObject_ReleaseBuffer(PyObject *obj, Py_buffer *view)
 {
         if (obj->ob_type->tp_as_buffer != NULL && 
             obj->ob_type->tp_as_buffer->bf_releasebuffer != NULL) {
@@ -341,7 +341,7 @@
 
 
 static int
-_IsFortranContiguous(PyBuffer *view)
+_IsFortranContiguous(Py_buffer *view)
 {
         Py_ssize_t sd, dim;
         int i;
@@ -362,7 +362,7 @@
 }
 
 static int
-_IsCContiguous(PyBuffer *view)
+_IsCContiguous(Py_buffer *view)
 {
         Py_ssize_t sd, dim;
         int i;
@@ -383,7 +383,7 @@
 }
 
 int
-PyBuffer_IsContiguous(PyBuffer *view, char fort)
+PyBuffer_IsContiguous(Py_buffer *view, char fort)
 {
 
         if (view->suboffsets != NULL) return 0;
@@ -399,7 +399,7 @@
 
 
 void* 
-PyBuffer_GetPointer(PyBuffer *view, Py_ssize_t *indices)
+PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
 {
         char* pointer;
         int i;
@@ -452,7 +452,7 @@
   */
 
 int 
-PyBuffer_ToContiguous(void *buf, PyBuffer *view, Py_ssize_t len, char fort)
+PyBuffer_ToContiguous(void *buf, Py_buffer *view, Py_ssize_t len, char fort)
 {
         int k;
         void (*addone)(int, Py_ssize_t *, Py_ssize_t *);
@@ -503,7 +503,7 @@
 }
 
 int
-PyBuffer_FromContiguous(PyBuffer *view, void *buf, Py_ssize_t len, char fort)
+PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
 {
         int k;
         void (*addone)(int, Py_ssize_t *, Py_ssize_t *);
@@ -556,7 +556,7 @@
 
 int PyObject_CopyData(PyObject *dest, PyObject *src) 
 {
-        PyBuffer view_dest, view_src;
+        Py_buffer view_dest, view_src;
         int k;
         Py_ssize_t *indices, elements;
         char *dptr, *sptr;
@@ -649,7 +649,7 @@
 }
 
 int
-PyBuffer_FillInfo(PyBuffer *view, void *buf, Py_ssize_t len,
+PyBuffer_FillInfo(Py_buffer *view, void *buf, Py_ssize_t len,
               int readonly, int flags)
 {        
         if (view == NULL) return 0;