Mercurial > cpython-lru_cache-weakref
annotate Objects/bufferobject.c @ 11239:577ea261bdf2 legacy-trunk
Find the help.txt file relative to __file__ or ".", not in sys.path.
(Suggested by Moshe Zadka, but implemented differently.)
Add <<python-docs>> event which, on Unix, brings up Netscape pointing
to http://www.python.doc/current/ (a local copy would be nice but its
location can't be predicted). Windows solution TBD.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Thu, 26 Aug 1999 23:06:05 +0000 |
| parents | fab81df566d0 |
| children | 1c7c2dd1beb1 |
| rev | line source |
|---|---|
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1 /*********************************************************** |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2 Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam, |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3 The Netherlands. |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5 All Rights Reserved |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
6 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
7 Permission to use, copy, modify, and distribute this software and its |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
8 documentation for any purpose and without fee is hereby granted, |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
9 provided that the above copyright notice appear in all copies and that |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
10 both that copyright notice and this permission notice appear in |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
11 supporting documentation, and that the names of Stichting Mathematisch |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
12 Centrum or CWI or Corporation for National Research Initiatives or |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
13 CNRI not be used in advertising or publicity pertaining to |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
14 distribution of the software without specific, written prior |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
15 permission. |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
16 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
17 While CWI is the initial source for this software, a modified version |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
18 is made available by the Corporation for National Research Initiatives |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
19 (CNRI) at the Internet address ftp://ftp.python.org. |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
20 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
21 STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
22 REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
23 MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
24 CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
25 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
26 PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
27 TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
28 PERFORMANCE OF THIS SOFTWARE. |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
29 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
30 ******************************************************************/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
31 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
32 /* Buffer object implementation */ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
33 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
34 #include "Python.h" |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
35 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
36 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
37 typedef struct { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
38 PyObject_HEAD |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
39 PyObject *b_base; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
40 void *b_ptr; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
41 int b_size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
42 int b_readonly; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
43 #ifdef CACHE_HASH |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
44 long b_hash; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
45 #endif |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
46 } PyBufferObject; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
47 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
48 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
49 static PyObject * |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
50 _PyBuffer_FromMemory(base, ptr, size, readonly) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
51 PyObject *base; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
52 void *ptr; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
53 int size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
54 int readonly; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
55 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
56 PyBufferObject * b; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
57 |
|
10427
e6799a855af7
Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents:
9305
diff
changeset
|
58 if ( size < 0 ) { |
|
e6799a855af7
Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents:
9305
diff
changeset
|
59 PyErr_SetString(PyExc_ValueError, |
|
e6799a855af7
Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents:
9305
diff
changeset
|
60 "size must be zero or positive"); |
|
e6799a855af7
Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents:
9305
diff
changeset
|
61 return NULL; |
|
e6799a855af7
Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents:
9305
diff
changeset
|
62 } |
|
e6799a855af7
Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents:
9305
diff
changeset
|
63 |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
64 b = PyObject_NEW(PyBufferObject, &PyBuffer_Type); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
65 if ( b == NULL ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
66 return NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
67 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
68 Py_XINCREF(base); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
69 b->b_base = base; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
70 b->b_ptr = ptr; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
71 b->b_size = size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
72 b->b_readonly = readonly; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
73 #ifdef CACHE_HASH |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
74 b->b_hash = -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
75 #endif |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
76 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
77 return (PyObject *) b; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
78 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
79 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
80 static PyObject * |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
81 _PyBuffer_FromObject(base, offset, size, proc, readonly) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
82 PyObject *base; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
83 int offset; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
84 int size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
85 getreadbufferproc proc; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
86 int readonly; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
87 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
88 PyBufferProcs *pb = base->ob_type->tp_as_buffer; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
89 void *p; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
90 int count; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
91 |
|
10427
e6799a855af7
Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents:
9305
diff
changeset
|
92 if ( offset < 0 ) { |
|
e6799a855af7
Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents:
9305
diff
changeset
|
93 PyErr_SetString(PyExc_ValueError, |
|
e6799a855af7
Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents:
9305
diff
changeset
|
94 "offset must be zero or positive"); |
|
e6799a855af7
Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents:
9305
diff
changeset
|
95 return NULL; |
|
e6799a855af7
Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents:
9305
diff
changeset
|
96 } |
|
e6799a855af7
Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents:
9305
diff
changeset
|
97 |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
98 if ( (*pb->bf_getsegcount)(base, NULL) != 1 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
99 { |
| 10460 | 100 PyErr_SetString(PyExc_TypeError, |
| 101 "single-segment buffer object expected"); | |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
102 return NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
103 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
104 if ( (count = (*proc)(base, 0, &p)) < 0 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
105 return NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
106 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
107 /* apply constraints to the start/end */ |
|
10427
e6799a855af7
Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents:
9305
diff
changeset
|
108 if ( size == Py_END_OF_BUFFER || size < 0 ) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
109 size = count; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
110 if ( offset > count ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
111 offset = count; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
112 if ( offset + size > count ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
113 size = count - offset; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
114 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
115 /* if the base object is another buffer, then "deref" it */ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
116 if ( PyBuffer_Check(base) ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
117 base = ((PyBufferObject *)base)->b_base; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
118 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
119 return _PyBuffer_FromMemory(base, (char *)p + offset, size, readonly); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
120 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
121 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
122 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
123 PyObject * |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
124 PyBuffer_FromObject(base, offset, size) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
125 PyObject *base; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
126 int offset; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
127 int size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
128 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
129 PyBufferProcs *pb = base->ob_type->tp_as_buffer; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
130 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
131 if ( pb == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
132 pb->bf_getreadbuffer == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
133 pb->bf_getsegcount == NULL ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
134 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
135 PyErr_SetString(PyExc_TypeError, "buffer object expected"); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
136 return NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
137 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
138 |
| 10460 | 139 return _PyBuffer_FromObject(base, offset, size, |
| 140 pb->bf_getreadbuffer, 1); | |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
141 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
142 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
143 PyObject * |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
144 PyBuffer_FromReadWriteObject(base, offset, size) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
145 PyObject *base; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
146 int offset; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
147 int size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
148 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
149 PyBufferProcs *pb = base->ob_type->tp_as_buffer; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
150 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
151 if ( pb == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
152 pb->bf_getwritebuffer == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
153 pb->bf_getsegcount == NULL ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
154 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
155 PyErr_SetString(PyExc_TypeError, "buffer object expected"); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
156 return NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
157 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
158 |
| 10460 | 159 return _PyBuffer_FromObject(base, offset, size, |
| 160 (getreadbufferproc)pb->bf_getwritebuffer, | |
| 161 0); | |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
162 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
163 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
164 PyObject * |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
165 PyBuffer_FromMemory(ptr, size) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
166 void *ptr; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
167 int size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
168 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
169 return _PyBuffer_FromMemory(NULL, ptr, size, 1); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
170 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
171 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
172 PyObject * |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
173 PyBuffer_FromReadWriteMemory(ptr, size) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
174 void *ptr; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
175 int size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
176 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
177 return _PyBuffer_FromMemory(NULL, ptr, size, 0); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
178 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
179 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
180 PyObject * |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
181 PyBuffer_New(size) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
182 int size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
183 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
184 PyBufferObject * b; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
185 |
|
11175
fab81df566d0
PyBuffer_New(): Raise ValueError if size is negative (the other
Fred Drake <fdrake@acm.org>
parents:
10460
diff
changeset
|
186 if (size < 0) { |
|
fab81df566d0
PyBuffer_New(): Raise ValueError if size is negative (the other
Fred Drake <fdrake@acm.org>
parents:
10460
diff
changeset
|
187 PyErr_SetString(PyExc_ValueError, |
|
fab81df566d0
PyBuffer_New(): Raise ValueError if size is negative (the other
Fred Drake <fdrake@acm.org>
parents:
10460
diff
changeset
|
188 "size must be zero or positive"); |
|
fab81df566d0
PyBuffer_New(): Raise ValueError if size is negative (the other
Fred Drake <fdrake@acm.org>
parents:
10460
diff
changeset
|
189 return NULL; |
|
fab81df566d0
PyBuffer_New(): Raise ValueError if size is negative (the other
Fred Drake <fdrake@acm.org>
parents:
10460
diff
changeset
|
190 } |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
191 b = (PyBufferObject *)malloc(sizeof(*b) + size); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
192 if ( b == NULL ) |
|
11175
fab81df566d0
PyBuffer_New(): Raise ValueError if size is negative (the other
Fred Drake <fdrake@acm.org>
parents:
10460
diff
changeset
|
193 return PyErr_NoMemory(); |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
194 b->ob_type = &PyBuffer_Type; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
195 _Py_NewReference((PyObject *)b); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
196 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
197 b->b_base = NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
198 b->b_ptr = (void *)(b + 1); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
199 b->b_size = size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
200 b->b_readonly = 0; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
201 #ifdef CACHE_HASH |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
202 b->b_hash = -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
203 #endif |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
204 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
205 return (PyObject *) b; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
206 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
207 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
208 /* Methods */ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
209 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
210 static void |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
211 buffer_dealloc(self) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
212 PyBufferObject *self; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
213 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
214 Py_XDECREF(self->b_base); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
215 free((void *)self); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
216 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
217 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
218 static int |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
219 buffer_compare(self, other) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
220 PyBufferObject *self; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
221 PyBufferObject *other; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
222 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
223 int len_self = self->b_size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
224 int len_other = other->b_size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
225 int min_len = (len_self < len_other) ? len_self : len_other; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
226 int cmp; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
227 if (min_len > 0) { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
228 cmp = memcmp(self->b_ptr, other->b_ptr, min_len); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
229 if (cmp != 0) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
230 return cmp; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
231 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
232 return (len_self < len_other) ? -1 : (len_self > len_other) ? 1 : 0; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
233 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
234 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
235 static PyObject * |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
236 buffer_repr(self) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
237 PyBufferObject *self; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
238 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
239 char buf[300]; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
240 char *status = self->b_readonly ? "read-only" : "read-write"; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
241 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
242 if ( self->b_base == NULL ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
243 { |
| 9286 | 244 sprintf(buf, "<%s buffer ptr %lx, size %d at %lx>", |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
245 status, |
| 9286 | 246 (long)self->b_ptr, |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
247 self->b_size, |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
248 (long)self); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
249 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
250 else |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
251 { |
| 9286 | 252 sprintf(buf, "<%s buffer for %lx, ptr %lx, size %d at %lx>", |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
253 status, |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
254 (long)self->b_base, |
| 9286 | 255 (long)self->b_ptr, |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
256 self->b_size, |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
257 (long)self); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
258 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
259 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
260 return PyString_FromString(buf); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
261 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
262 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
263 static long |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
264 buffer_hash(self) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
265 PyBufferObject *self; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
266 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
267 register int len; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
268 register unsigned char *p; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
269 register long x; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
270 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
271 #ifdef CACHE_HASH |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
272 if ( self->b_hash != -1 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
273 return self->b_hash; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
274 #endif |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
275 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
276 if ( !self->b_readonly ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
277 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
278 /* ### use different wording, since this is conditional? */ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
279 PyErr_SetString(PyExc_TypeError, "unhashable type"); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
280 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
281 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
282 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
283 len = self->b_size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
284 p = (unsigned char *) self->b_ptr; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
285 x = *p << 7; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
286 while (--len >= 0) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
287 x = (1000003*x) ^ *p++; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
288 x ^= self->b_size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
289 if (x == -1) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
290 x = -2; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
291 #ifdef CACHE_HASH |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
292 self->b_hash = x; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
293 #endif |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
294 return x; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
295 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
296 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
297 static PyObject * |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
298 buffer_str(self) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
299 PyBufferObject *self; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
300 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
301 return PyString_FromStringAndSize(self->b_ptr, self->b_size); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
302 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
303 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
304 /* Sequence methods */ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
305 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
306 static int |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
307 buffer_length(self) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
308 PyBufferObject *self; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
309 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
310 return self->b_size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
311 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
312 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
313 static PyObject * |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
314 buffer_concat(self, other) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
315 PyBufferObject *self; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
316 PyObject *other; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
317 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
318 PyBufferProcs *pb = other->ob_type->tp_as_buffer; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
319 char *p1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
320 void *p2; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
321 PyObject *ob; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
322 int count; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
323 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
324 if ( pb == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
325 pb->bf_getreadbuffer == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
326 pb->bf_getsegcount == NULL ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
327 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
328 PyErr_BadArgument(); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
329 return NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
330 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
331 if ( (*pb->bf_getsegcount)(other, NULL) != 1 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
332 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
333 /* ### use a different exception type/message? */ |
| 10460 | 334 PyErr_SetString(PyExc_TypeError, |
| 335 "single-segment buffer object expected"); | |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
336 return NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
337 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
338 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
339 /* optimize special case */ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
340 if ( self->b_size == 0 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
341 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
342 Py_INCREF(other); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
343 return other; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
344 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
345 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
346 if ( (count = (*pb->bf_getreadbuffer)(other, 0, &p2)) < 0 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
347 return NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
348 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
349 /* optimize special case */ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
350 if ( count == 0 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
351 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
352 Py_INCREF(self); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
353 return (PyObject *)self; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
354 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
355 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
356 ob = PyString_FromStringAndSize(NULL, self->b_size + count); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
357 p1 = PyString_AS_STRING(ob); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
358 memcpy(p1, self->b_ptr, self->b_size); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
359 memcpy(p1 + self->b_size, p2, count); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
360 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
361 /* there is an extra byte in the string object, so this is safe */ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
362 p1[self->b_size + count] = '\0'; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
363 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
364 return ob; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
365 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
366 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
367 static PyObject * |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
368 buffer_repeat(self, count) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
369 PyBufferObject *self; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
370 int count; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
371 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
372 PyObject *ob; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
373 register char *p; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
374 void *ptr = self->b_ptr; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
375 int size = self->b_size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
376 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
377 if ( count < 0 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
378 count = 0; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
379 ob = PyString_FromStringAndSize(NULL, size * count); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
380 if ( ob == NULL ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
381 return NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
382 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
383 p = PyString_AS_STRING(ob); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
384 while ( count-- ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
385 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
386 memcpy(p, ptr, size); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
387 p += size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
388 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
389 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
390 /* there is an extra byte in the string object, so this is safe */ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
391 *p = '\0'; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
392 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
393 return ob; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
394 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
395 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
396 static PyObject * |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
397 buffer_item(self, idx) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
398 PyBufferObject *self; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
399 int idx; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
400 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
401 if ( idx < 0 || idx >= self->b_size ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
402 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
403 PyErr_SetString(PyExc_IndexError, "buffer index out of range"); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
404 return NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
405 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
406 return PyString_FromStringAndSize((char *)self->b_ptr + idx, 1); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
407 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
408 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
409 static PyObject * |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
410 buffer_slice(self, left, right) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
411 PyBufferObject *self; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
412 int left; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
413 int right; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
414 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
415 if ( left < 0 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
416 left = 0; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
417 if ( right < 0 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
418 right = 0; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
419 if ( right > self->b_size ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
420 right = self->b_size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
421 if ( left == 0 && right == self->b_size ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
422 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
423 /* same as self */ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
424 Py_INCREF(self); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
425 return (PyObject *)self; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
426 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
427 if ( right < left ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
428 right = left; |
| 10460 | 429 return PyString_FromStringAndSize((char *)self->b_ptr + left, |
| 430 right - left); | |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
431 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
432 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
433 static int |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
434 buffer_ass_item(self, idx, other) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
435 PyBufferObject *self; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
436 int idx; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
437 PyObject *other; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
438 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
439 PyBufferProcs *pb; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
440 void *p; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
441 int count; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
442 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
443 if ( self->b_readonly ) { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
444 PyErr_SetString(PyExc_TypeError, |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
445 "buffer is read-only"); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
446 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
447 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
448 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
449 if (idx < 0 || idx >= self->b_size) { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
450 PyErr_SetString(PyExc_IndexError, |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
451 "buffer assignment index out of range"); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
452 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
453 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
454 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
455 pb = other ? other->ob_type->tp_as_buffer : NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
456 if ( pb == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
457 pb->bf_getreadbuffer == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
458 pb->bf_getsegcount == NULL ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
459 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
460 PyErr_BadArgument(); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
461 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
462 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
463 if ( (*pb->bf_getsegcount)(other, NULL) != 1 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
464 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
465 /* ### use a different exception type/message? */ |
| 10460 | 466 PyErr_SetString(PyExc_TypeError, |
| 467 "single-segment buffer object expected"); | |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
468 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
469 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
470 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
471 if ( (count = (*pb->bf_getreadbuffer)(other, 0, &p)) < 0 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
472 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
473 if ( count != 1 ) { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
474 PyErr_SetString(PyExc_TypeError, |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
475 "right operand must be a single byte"); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
476 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
477 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
478 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
479 ((char *)self->b_ptr)[idx] = *(char *)p; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
480 return 0; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
481 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
482 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
483 static int |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
484 buffer_ass_slice(self, left, right, other) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
485 PyBufferObject *self; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
486 int left; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
487 int right; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
488 PyObject *other; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
489 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
490 PyBufferProcs *pb; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
491 void *p; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
492 int slice_len; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
493 int count; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
494 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
495 if ( self->b_readonly ) { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
496 PyErr_SetString(PyExc_TypeError, |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
497 "buffer is read-only"); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
498 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
499 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
500 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
501 pb = other ? other->ob_type->tp_as_buffer : NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
502 if ( pb == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
503 pb->bf_getreadbuffer == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
504 pb->bf_getsegcount == NULL ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
505 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
506 PyErr_BadArgument(); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
507 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
508 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
509 if ( (*pb->bf_getsegcount)(other, NULL) != 1 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
510 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
511 /* ### use a different exception type/message? */ |
| 10460 | 512 PyErr_SetString(PyExc_TypeError, |
| 513 "single-segment buffer object expected"); | |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
514 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
515 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
516 if ( (count = (*pb->bf_getreadbuffer)(other, 0, &p)) < 0 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
517 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
518 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
519 if ( left < 0 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
520 left = 0; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
521 else if ( left > self->b_size ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
522 left = self->b_size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
523 if ( right < left ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
524 right = left; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
525 else if ( right > self->b_size ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
526 right = self->b_size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
527 slice_len = right - left; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
528 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
529 if ( count != slice_len ) { |
| 10460 | 530 PyErr_SetString( |
| 531 PyExc_TypeError, | |
| 532 "right operand length must match slice length"); | |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
533 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
534 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
535 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
536 if ( slice_len ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
537 memcpy((char *)self->b_ptr + left, p, slice_len); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
538 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
539 return 0; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
540 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
541 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
542 /* Buffer methods */ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
543 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
544 static int |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
545 buffer_getreadbuf(self, idx, pp) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
546 PyBufferObject *self; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
547 int idx; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
548 void ** pp; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
549 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
550 if ( idx != 0 ) { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
551 PyErr_SetString(PyExc_SystemError, |
|
9305
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
552 "accessing non-existent buffer segment"); |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
553 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
554 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
555 *pp = self->b_ptr; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
556 return self->b_size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
557 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
558 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
559 static int |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
560 buffer_getwritebuf(self, idx, pp) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
561 PyBufferObject *self; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
562 int idx; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
563 void ** pp; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
564 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
565 if ( self->b_readonly ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
566 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
567 PyErr_SetString(PyExc_TypeError, "buffer is read-only"); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
568 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
569 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
570 return buffer_getreadbuf(self, idx, pp); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
571 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
572 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
573 static int |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
574 buffer_getsegcount(self, lenp) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
575 PyBufferObject *self; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
576 int *lenp; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
577 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
578 if ( lenp ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
579 *lenp = self->b_size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
580 return 1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
581 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
582 |
|
9305
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
583 static int |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
584 buffer_getcharbuf(self, idx, pp) |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
585 PyBufferObject *self; |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
586 int idx; |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
587 const char ** pp; |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
588 { |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
589 if ( idx != 0 ) { |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
590 PyErr_SetString(PyExc_SystemError, |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
591 "accessing non-existent buffer segment"); |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
592 return -1; |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
593 } |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
594 *pp = (const char *)self->b_ptr; |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
595 return self->b_size; |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
596 } |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
597 |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
598 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
599 static PySequenceMethods buffer_as_sequence = { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
600 (inquiry)buffer_length, /*sq_length*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
601 (binaryfunc)buffer_concat, /*sq_concat*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
602 (intargfunc)buffer_repeat, /*sq_repeat*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
603 (intargfunc)buffer_item, /*sq_item*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
604 (intintargfunc)buffer_slice, /*sq_slice*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
605 (intobjargproc)buffer_ass_item, /*sq_ass_item*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
606 (intintobjargproc)buffer_ass_slice, /*sq_ass_slice*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
607 }; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
608 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
609 static PyBufferProcs buffer_as_buffer = { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
610 (getreadbufferproc)buffer_getreadbuf, |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
611 (getwritebufferproc)buffer_getwritebuf, |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
612 (getsegcountproc)buffer_getsegcount, |
|
9305
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
613 (getcharbufferproc)buffer_getcharbuf, |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
614 }; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
615 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
616 PyTypeObject PyBuffer_Type = { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
617 PyObject_HEAD_INIT(&PyType_Type) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
618 0, |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
619 "buffer", |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
620 sizeof(PyBufferObject), |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
621 0, |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
622 (destructor)buffer_dealloc, /*tp_dealloc*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
623 0, /*tp_print*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
624 0, /*tp_getattr*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
625 0, /*tp_setattr*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
626 (cmpfunc)buffer_compare, /*tp_compare*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
627 (reprfunc)buffer_repr, /*tp_repr*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
628 0, /*tp_as_number*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
629 &buffer_as_sequence, /*tp_as_sequence*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
630 0, /*tp_as_mapping*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
631 (hashfunc)buffer_hash, /*tp_hash*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
632 0, /*tp_call*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
633 (reprfunc)buffer_str, /*tp_str*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
634 0, /*tp_getattro*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
635 0, /*tp_setattro*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
636 &buffer_as_buffer, /*tp_as_buffer*/ |
|
9305
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
637 Py_TPFLAGS_DEFAULT, /*tp_flags*/ |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
638 0, /*tp_doc*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
639 }; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
640 |
