Mercurial > cpython-lru_cache-weakref
annotate Objects/bufferobject.c @ 20737:00a581bdedeb legacy-trunk
When overriding __str__ or __repr__, set the tp_print slot to NULL.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Mon, 29 Oct 2001 14:33:44 +0000 |
| parents | 6f9902ace18d |
| children | f3a416b178c4 |
| 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 /* Buffer object implementation */ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4 #include "Python.h" |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5 |
|
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 typedef struct { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
8 PyObject_HEAD |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
9 PyObject *b_base; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
10 void *b_ptr; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
11 int b_size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
12 int b_readonly; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
13 #ifdef CACHE_HASH |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
14 long b_hash; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
15 #endif |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
16 } PyBufferObject; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
17 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
18 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
19 static PyObject * |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
20 _PyBuffer_FromMemory(PyObject *base, void *ptr, int size, int readonly) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
21 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
22 PyBufferObject * b; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
23 |
|
10427
e6799a855af7
Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents:
9305
diff
changeset
|
24 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
|
25 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
|
26 "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
|
27 return NULL; |
|
e6799a855af7
Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents:
9305
diff
changeset
|
28 } |
|
e6799a855af7
Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents:
9305
diff
changeset
|
29 |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
30 b = PyObject_NEW(PyBufferObject, &PyBuffer_Type); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
31 if ( b == NULL ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
32 return NULL; |
|
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 Py_XINCREF(base); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
35 b->b_base = base; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
36 b->b_ptr = ptr; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
37 b->b_size = size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
38 b->b_readonly = readonly; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
39 #ifdef CACHE_HASH |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
40 b->b_hash = -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
41 #endif |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
42 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
43 return (PyObject *) b; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
44 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
45 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
46 static PyObject * |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
47 _PyBuffer_FromObject(PyObject *base, int offset, int size, |
|
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
48 getreadbufferproc proc, int readonly) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
49 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
50 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
|
51 void *p; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
52 int count; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
53 |
|
10427
e6799a855af7
Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents:
9305
diff
changeset
|
54 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
|
55 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
|
56 "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
|
57 return NULL; |
|
e6799a855af7
Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents:
9305
diff
changeset
|
58 } |
|
e6799a855af7
Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents:
9305
diff
changeset
|
59 |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
60 if ( (*pb->bf_getsegcount)(base, NULL) != 1 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
61 { |
| 10460 | 62 PyErr_SetString(PyExc_TypeError, |
| 63 "single-segment buffer object expected"); | |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
64 return NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
65 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
66 if ( (count = (*proc)(base, 0, &p)) < 0 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
67 return NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
68 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
69 /* 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
|
70 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
|
71 size = count; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
72 if ( offset > count ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
73 offset = count; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
74 if ( offset + size > count ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
75 size = count - offset; |
| 20565 | 76 |
| 77 /* if the base object is another buffer, then "deref" it, | |
| 78 * except if the base of the other buffer is NULL | |
| 79 */ | |
| 80 if ( PyBuffer_Check(base) && (((PyBufferObject *)base)->b_base) ) | |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
81 base = ((PyBufferObject *)base)->b_base; |
| 20565 | 82 |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
83 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
|
84 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
85 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
86 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
87 PyObject * |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
88 PyBuffer_FromObject(PyObject *base, int offset, int size) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
89 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
90 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
|
91 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
92 if ( pb == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
93 pb->bf_getreadbuffer == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
94 pb->bf_getsegcount == NULL ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
95 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
96 PyErr_SetString(PyExc_TypeError, "buffer object expected"); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
97 return NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
98 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
99 |
| 10460 | 100 return _PyBuffer_FromObject(base, offset, size, |
| 101 pb->bf_getreadbuffer, 1); | |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
102 } |
|
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 PyObject * |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
105 PyBuffer_FromReadWriteObject(PyObject *base, int offset, int size) |
|
9278
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 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
|
108 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
109 if ( pb == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
110 pb->bf_getwritebuffer == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
111 pb->bf_getsegcount == NULL ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
112 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
113 PyErr_SetString(PyExc_TypeError, "buffer object expected"); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
114 return NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
115 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
116 |
| 10460 | 117 return _PyBuffer_FromObject(base, offset, size, |
| 118 (getreadbufferproc)pb->bf_getwritebuffer, | |
| 119 0); | |
|
9278
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 PyObject * |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
123 PyBuffer_FromMemory(void *ptr, int size) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
124 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
125 return _PyBuffer_FromMemory(NULL, ptr, size, 1); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
126 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
127 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
128 PyObject * |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
129 PyBuffer_FromReadWriteMemory(void *ptr, int size) |
|
9278
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 return _PyBuffer_FromMemory(NULL, ptr, size, 0); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
132 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
133 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
134 PyObject * |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
135 PyBuffer_New(int size) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
136 { |
|
13861
f3d5f71ccbb4
Removing warnings found by gcc -Wall
Moshe Zadka <moshez@math.huji.ac.il>
parents:
13449
diff
changeset
|
137 PyObject *o; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
138 PyBufferObject * b; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
139 |
|
11175
fab81df566d0
PyBuffer_New(): Raise ValueError if size is negative (the other
Fred Drake <fdrake@acm.org>
parents:
10460
diff
changeset
|
140 if (size < 0) { |
|
fab81df566d0
PyBuffer_New(): Raise ValueError if size is negative (the other
Fred Drake <fdrake@acm.org>
parents:
10460
diff
changeset
|
141 PyErr_SetString(PyExc_ValueError, |
|
fab81df566d0
PyBuffer_New(): Raise ValueError if size is negative (the other
Fred Drake <fdrake@acm.org>
parents:
10460
diff
changeset
|
142 "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
|
143 return NULL; |
|
fab81df566d0
PyBuffer_New(): Raise ValueError if size is negative (the other
Fred Drake <fdrake@acm.org>
parents:
10460
diff
changeset
|
144 } |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11175
diff
changeset
|
145 /* PyObject_New is inlined */ |
|
13861
f3d5f71ccbb4
Removing warnings found by gcc -Wall
Moshe Zadka <moshez@math.huji.ac.il>
parents:
13449
diff
changeset
|
146 o = PyObject_MALLOC(sizeof(*b) + size); |
|
f3d5f71ccbb4
Removing warnings found by gcc -Wall
Moshe Zadka <moshez@math.huji.ac.il>
parents:
13449
diff
changeset
|
147 if ( o == NULL ) |
|
11175
fab81df566d0
PyBuffer_New(): Raise ValueError if size is negative (the other
Fred Drake <fdrake@acm.org>
parents:
10460
diff
changeset
|
148 return PyErr_NoMemory(); |
|
13861
f3d5f71ccbb4
Removing warnings found by gcc -Wall
Moshe Zadka <moshez@math.huji.ac.il>
parents:
13449
diff
changeset
|
149 b = (PyBufferObject *) PyObject_INIT(o, &PyBuffer_Type); |
|
9278
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 b->b_base = NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
152 b->b_ptr = (void *)(b + 1); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
153 b->b_size = size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
154 b->b_readonly = 0; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
155 #ifdef CACHE_HASH |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
156 b->b_hash = -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
157 #endif |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
158 |
|
13861
f3d5f71ccbb4
Removing warnings found by gcc -Wall
Moshe Zadka <moshez@math.huji.ac.il>
parents:
13449
diff
changeset
|
159 return o; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
160 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
161 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
162 /* Methods */ |
|
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 static void |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
165 buffer_dealloc(PyBufferObject *self) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
166 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
167 Py_XDECREF(self->b_base); |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11175
diff
changeset
|
168 PyObject_DEL(self); |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
169 } |
|
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 static int |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
172 buffer_compare(PyBufferObject *self, PyBufferObject *other) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
173 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
174 int len_self = self->b_size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
175 int len_other = other->b_size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
176 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
|
177 int cmp; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
178 if (min_len > 0) { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
179 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
|
180 if (cmp != 0) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
181 return cmp; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
182 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
183 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
|
184 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
185 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
186 static PyObject * |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
187 buffer_repr(PyBufferObject *self) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
188 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
189 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
|
190 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
191 if ( self->b_base == NULL ) |
|
19476
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
18933
diff
changeset
|
192 return PyString_FromFormat("<%s buffer ptr %p, size %d at %p>", |
|
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
18933
diff
changeset
|
193 status, |
|
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
18933
diff
changeset
|
194 self->b_ptr, |
|
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
18933
diff
changeset
|
195 self->b_size, |
|
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
18933
diff
changeset
|
196 self); |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
197 else |
|
19476
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
18933
diff
changeset
|
198 return PyString_FromFormat( |
|
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
18933
diff
changeset
|
199 "<%s buffer for %p, ptr %p, size %d at %p>", |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
200 status, |
|
13210
ff243b0f16ee
Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents:
12576
diff
changeset
|
201 self->b_base, |
|
ff243b0f16ee
Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents:
12576
diff
changeset
|
202 self->b_ptr, |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
203 self->b_size, |
|
13210
ff243b0f16ee
Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents:
12576
diff
changeset
|
204 self); |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
205 } |
|
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 static long |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
208 buffer_hash(PyBufferObject *self) |
|
9278
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 register int len; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
211 register unsigned char *p; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
212 register long x; |
|
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 #ifdef CACHE_HASH |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
215 if ( self->b_hash != -1 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
216 return self->b_hash; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
217 #endif |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
218 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
219 if ( !self->b_readonly ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
220 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
221 /* ### use different wording, since this is conditional? */ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
222 PyErr_SetString(PyExc_TypeError, "unhashable type"); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
223 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
224 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
225 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
226 len = self->b_size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
227 p = (unsigned char *) self->b_ptr; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
228 x = *p << 7; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
229 while (--len >= 0) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
230 x = (1000003*x) ^ *p++; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
231 x ^= self->b_size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
232 if (x == -1) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
233 x = -2; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
234 #ifdef CACHE_HASH |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
235 self->b_hash = x; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
236 #endif |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
237 return x; |
|
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 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
240 static PyObject * |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
241 buffer_str(PyBufferObject *self) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
242 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
243 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
|
244 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
245 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
246 /* Sequence methods */ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
247 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
248 static int |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
249 buffer_length(PyBufferObject *self) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
250 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
251 return self->b_size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
252 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
253 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
254 static PyObject * |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
255 buffer_concat(PyBufferObject *self, PyObject *other) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
256 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
257 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
|
258 char *p1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
259 void *p2; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
260 PyObject *ob; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
261 int count; |
|
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 if ( pb == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
264 pb->bf_getreadbuffer == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
265 pb->bf_getsegcount == NULL ) |
|
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 PyErr_BadArgument(); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
268 return NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
269 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
270 if ( (*pb->bf_getsegcount)(other, NULL) != 1 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
271 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
272 /* ### use a different exception type/message? */ |
| 10460 | 273 PyErr_SetString(PyExc_TypeError, |
| 274 "single-segment buffer object expected"); | |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
275 return NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
276 } |
|
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 /* optimize special case */ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
279 if ( self->b_size == 0 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
280 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
281 Py_INCREF(other); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
282 return other; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
283 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
284 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
285 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
|
286 return NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
287 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
288 /* optimize special case */ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
289 if ( count == 0 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
290 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
291 Py_INCREF(self); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
292 return (PyObject *)self; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
293 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
294 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
295 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
|
296 p1 = PyString_AS_STRING(ob); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
297 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
|
298 memcpy(p1 + self->b_size, p2, count); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
299 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
300 /* 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
|
301 p1[self->b_size + count] = '\0'; |
|
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 return ob; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
304 } |
|
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 PyObject * |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
307 buffer_repeat(PyBufferObject *self, int count) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
308 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
309 PyObject *ob; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
310 register char *p; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
311 void *ptr = self->b_ptr; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
312 int size = self->b_size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
313 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
314 if ( count < 0 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
315 count = 0; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
316 ob = PyString_FromStringAndSize(NULL, size * count); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
317 if ( ob == NULL ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
318 return NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
319 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
320 p = PyString_AS_STRING(ob); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
321 while ( count-- ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
322 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
323 memcpy(p, ptr, size); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
324 p += size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
325 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
326 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
327 /* 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
|
328 *p = '\0'; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
329 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
330 return ob; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
331 } |
|
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 static PyObject * |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
334 buffer_item(PyBufferObject *self, int idx) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
335 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
336 if ( idx < 0 || idx >= self->b_size ) |
|
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 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
|
339 return NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
340 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
341 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
|
342 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
343 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
344 static PyObject * |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
345 buffer_slice(PyBufferObject *self, int left, int right) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
346 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
347 if ( left < 0 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
348 left = 0; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
349 if ( right < 0 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
350 right = 0; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
351 if ( right > self->b_size ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
352 right = self->b_size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
353 if ( left == 0 && right == self->b_size ) |
|
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 /* same as self */ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
356 Py_INCREF(self); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
357 return (PyObject *)self; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
358 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
359 if ( right < left ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
360 right = left; |
| 10460 | 361 return PyString_FromStringAndSize((char *)self->b_ptr + left, |
| 362 right - left); | |
|
9278
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 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
365 static int |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
366 buffer_ass_item(PyBufferObject *self, int idx, PyObject *other) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
367 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
368 PyBufferProcs *pb; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
369 void *p; |
|
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 if ( self->b_readonly ) { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
373 PyErr_SetString(PyExc_TypeError, |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
374 "buffer is read-only"); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
375 return -1; |
|
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 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
378 if (idx < 0 || idx >= self->b_size) { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
379 PyErr_SetString(PyExc_IndexError, |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
380 "buffer assignment index out of range"); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
381 return -1; |
|
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 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
384 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
|
385 if ( pb == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
386 pb->bf_getreadbuffer == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
387 pb->bf_getsegcount == NULL ) |
|
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 PyErr_BadArgument(); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
390 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
391 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
392 if ( (*pb->bf_getsegcount)(other, NULL) != 1 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
393 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
394 /* ### use a different exception type/message? */ |
| 10460 | 395 PyErr_SetString(PyExc_TypeError, |
| 396 "single-segment buffer object expected"); | |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
397 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
398 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
399 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
400 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
|
401 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
402 if ( count != 1 ) { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
403 PyErr_SetString(PyExc_TypeError, |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
404 "right operand must be a single byte"); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
405 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
406 } |
|
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 ((char *)self->b_ptr)[idx] = *(char *)p; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
409 return 0; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
410 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
411 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
412 static int |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
413 buffer_ass_slice(PyBufferObject *self, int left, int right, PyObject *other) |
|
9278
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 PyBufferProcs *pb; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
416 void *p; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
417 int slice_len; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
418 int count; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
419 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
420 if ( self->b_readonly ) { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
421 PyErr_SetString(PyExc_TypeError, |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
422 "buffer is read-only"); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
423 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
424 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
425 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
426 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
|
427 if ( pb == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
428 pb->bf_getreadbuffer == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
429 pb->bf_getsegcount == NULL ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
430 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
431 PyErr_BadArgument(); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
432 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
433 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
434 if ( (*pb->bf_getsegcount)(other, NULL) != 1 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
435 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
436 /* ### use a different exception type/message? */ |
| 10460 | 437 PyErr_SetString(PyExc_TypeError, |
| 438 "single-segment buffer object expected"); | |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
439 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
440 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
441 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
|
442 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
443 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
444 if ( left < 0 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
445 left = 0; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
446 else if ( left > self->b_size ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
447 left = self->b_size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
448 if ( right < left ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
449 right = left; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
450 else if ( right > self->b_size ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
451 right = self->b_size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
452 slice_len = right - left; |
|
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 if ( count != slice_len ) { |
| 10460 | 455 PyErr_SetString( |
| 456 PyExc_TypeError, | |
| 457 "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
|
458 return -1; |
|
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 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
461 if ( slice_len ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
462 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
|
463 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
464 return 0; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
465 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
466 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
467 /* Buffer methods */ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
468 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
469 static int |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
470 buffer_getreadbuf(PyBufferObject *self, int idx, void **pp) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
471 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
472 if ( idx != 0 ) { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
473 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
|
474 "accessing non-existent buffer segment"); |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
475 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
476 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
477 *pp = self->b_ptr; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
478 return self->b_size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
479 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
480 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
481 static int |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
482 buffer_getwritebuf(PyBufferObject *self, int idx, void **pp) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
483 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
484 if ( self->b_readonly ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
485 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
486 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
|
487 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
488 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
489 return buffer_getreadbuf(self, idx, pp); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
490 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
491 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
492 static int |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
493 buffer_getsegcount(PyBufferObject *self, int *lenp) |
|
9278
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 ( lenp ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
496 *lenp = self->b_size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
497 return 1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
498 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
499 |
|
9305
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
500 static int |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
501 buffer_getcharbuf(PyBufferObject *self, int idx, const char **pp) |
|
9305
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
502 { |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
503 if ( idx != 0 ) { |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
504 PyErr_SetString(PyExc_SystemError, |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
505 "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
|
506 return -1; |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
507 } |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
508 *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
|
509 return self->b_size; |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
510 } |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
511 |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
512 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
513 static PySequenceMethods buffer_as_sequence = { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
514 (inquiry)buffer_length, /*sq_length*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
515 (binaryfunc)buffer_concat, /*sq_concat*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
516 (intargfunc)buffer_repeat, /*sq_repeat*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
517 (intargfunc)buffer_item, /*sq_item*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
518 (intintargfunc)buffer_slice, /*sq_slice*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
519 (intobjargproc)buffer_ass_item, /*sq_ass_item*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
520 (intintobjargproc)buffer_ass_slice, /*sq_ass_slice*/ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
521 }; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
522 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
523 static PyBufferProcs buffer_as_buffer = { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
524 (getreadbufferproc)buffer_getreadbuf, |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
525 (getwritebufferproc)buffer_getwritebuf, |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
526 (getsegcountproc)buffer_getsegcount, |
|
9305
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
527 (getcharbufferproc)buffer_getcharbuf, |
|
9278
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 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
530 PyTypeObject PyBuffer_Type = { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
531 PyObject_HEAD_INIT(&PyType_Type) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
532 0, |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
533 "buffer", |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
534 sizeof(PyBufferObject), |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
535 0, |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
536 (destructor)buffer_dealloc, /* tp_dealloc */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
537 0, /* tp_print */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
538 0, /* tp_getattr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
539 0, /* tp_setattr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
540 (cmpfunc)buffer_compare, /* tp_compare */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
541 (reprfunc)buffer_repr, /* tp_repr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
542 0, /* tp_as_number */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
543 &buffer_as_sequence, /* tp_as_sequence */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
544 0, /* tp_as_mapping */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
545 (hashfunc)buffer_hash, /* tp_hash */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
546 0, /* tp_call */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
547 (reprfunc)buffer_str, /* tp_str */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
548 PyObject_GenericGetAttr, /* tp_getattro */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
549 0, /* tp_setattro */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
550 &buffer_as_buffer, /* tp_as_buffer */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
551 Py_TPFLAGS_DEFAULT, /* tp_flags */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
552 0, /* tp_doc */ |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
553 }; |
