annotate Objects/bufferobject.c @ 38664:7619216bbc19 2.4

Bug #1502728: Correctly link against librt library on HP-UX. (backport from rev. 46743)
author Georg Brandl <georg@python.org>
date Thu, 08 Jun 2006 12:54:16 +0000
parents 97c97194e64b
children 3f358afbb3d3 0bc6cfb6b5fb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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;
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
12 int b_offset;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 int b_readonly;
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 } PyBufferObject;
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
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
18 static int
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
19 get_buf(PyBufferObject *self, void **ptr, int *size)
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
20 {
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
21 if (self->b_base == NULL) {
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
22 assert (ptr != NULL);
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
23 *ptr = self->b_ptr;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
24 *size = self->b_size;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
25 }
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
26 else {
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
27 int count, offset;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
28 getreadbufferproc proc;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
29 PyBufferProcs *bp = self->b_base->ob_type->tp_as_buffer;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
30 if ((*bp->bf_getsegcount)(self->b_base, NULL) != 1) {
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
31 PyErr_SetString(PyExc_TypeError,
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
32 "single-segment buffer object expected");
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
33 return 0;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
34 }
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
35 if (self->b_readonly)
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
36 proc = bp->bf_getreadbuffer;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
37 else
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
38 proc = (getreadbufferproc)bp->bf_getwritebuffer;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
39 if ((count = (*proc)(self->b_base, 0, ptr)) < 0)
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
40 return 0;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
41 /* apply constraints to the start/end */
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
42 if (self->b_offset > count)
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
43 offset = count;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
44 else
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
45 offset = self->b_offset;
31810
7a120400888a Correct code to advance ptr to be well-formed C.
Martin v. Löwis <martin@v.loewis.de>
parents: 31640
diff changeset
46 *(char **)ptr = *(char **)ptr + offset;
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
47 if (self->b_size == Py_END_OF_BUFFER)
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
48 *size = count;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
49 else
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
50 *size = self->b_size;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
51 if (offset + *size > count)
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
52 *size = count - offset;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
53 }
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
54 return 1;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
55 }
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
56
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
57
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 static PyObject *
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
59 buffer_from_memory(PyObject *base, int size, int offset, void *ptr,
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
60 int readonly)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 {
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 PyBufferObject * b;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
63
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
64 if (size < 0 && size != Py_END_OF_BUFFER) {
10427
e6799a855af7 Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents: 9305
diff changeset
65 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
66 "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
67 return NULL;
e6799a855af7 Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents: 9305
diff changeset
68 }
33559
be8cff4a1eca Fix buffer offset calculation (need to compute it before changing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31810
diff changeset
69 if (offset < 0) {
be8cff4a1eca Fix buffer offset calculation (need to compute it before changing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31810
diff changeset
70 PyErr_SetString(PyExc_ValueError,
be8cff4a1eca Fix buffer offset calculation (need to compute it before changing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31810
diff changeset
71 "offset must be zero or positive");
be8cff4a1eca Fix buffer offset calculation (need to compute it before changing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31810
diff changeset
72 return NULL;
be8cff4a1eca Fix buffer offset calculation (need to compute it before changing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31810
diff changeset
73 }
10427
e6799a855af7 Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents: 9305
diff changeset
74
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 b = PyObject_NEW(PyBufferObject, &PyBuffer_Type);
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 if ( b == NULL )
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 return NULL;
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 Py_XINCREF(base);
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 b->b_base = base;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 b->b_ptr = ptr;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
82 b->b_size = size;
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
83 b->b_offset = offset;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 b->b_readonly = readonly;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 b->b_hash = -1;
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 return (PyObject *) b;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 }
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 static PyObject *
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
91 buffer_from_object(PyObject *base, int size, int offset, int readonly)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 {
33560
97cb9eea212e Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 33559
diff changeset
93 if (offset < 0) {
97cb9eea212e Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 33559
diff changeset
94 PyErr_SetString(PyExc_ValueError,
97cb9eea212e Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 33559
diff changeset
95 "offset must be zero or positive");
97cb9eea212e Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 33559
diff changeset
96 return NULL;
97cb9eea212e Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 33559
diff changeset
97 }
33559
be8cff4a1eca Fix buffer offset calculation (need to compute it before changing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31810
diff changeset
98 if ( PyBuffer_Check(base) && (((PyBufferObject *)base)->b_base) ) {
be8cff4a1eca Fix buffer offset calculation (need to compute it before changing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31810
diff changeset
99 /* another buffer, refer to the base object */
33560
97cb9eea212e Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 33559
diff changeset
100 PyBufferObject *b = (PyBufferObject *)base;
97cb9eea212e Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 33559
diff changeset
101 if (b->b_size != Py_END_OF_BUFFER) {
97cb9eea212e Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 33559
diff changeset
102 int base_size = b->b_size - offset;
97cb9eea212e Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 33559
diff changeset
103 if (base_size < 0)
97cb9eea212e Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 33559
diff changeset
104 base_size = 0;
97cb9eea212e Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 33559
diff changeset
105 if (size == Py_END_OF_BUFFER || size > base_size)
97cb9eea212e Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 33559
diff changeset
106 size = base_size;
97cb9eea212e Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 33559
diff changeset
107 }
97cb9eea212e Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 33559
diff changeset
108 offset += b->b_offset;
97cb9eea212e Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 33559
diff changeset
109 base = b->b_base;
10427
e6799a855af7 Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents: 9305
diff changeset
110 }
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
111 return buffer_from_memory(base, size, offset, NULL, readonly);
9278
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
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 PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
116 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
117 {
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
118 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
119
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 if ( pb == NULL ||
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 pb->bf_getreadbuffer == NULL ||
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 pb->bf_getsegcount == NULL )
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 {
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
124 PyErr_SetString(PyExc_TypeError, "buffer object expected");
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
125 return NULL;
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
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
128 return buffer_from_object(base, size, offset, 1);
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
129 }
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 PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
132 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
133 {
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
134 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
135
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
136 if ( pb == NULL ||
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
137 pb->bf_getwritebuffer == NULL ||
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
138 pb->bf_getsegcount == NULL )
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
139 {
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
140 PyErr_SetString(PyExc_TypeError, "buffer object expected");
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
141 return NULL;
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
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
144 return buffer_from_object(base, size, offset, 0);
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
146
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
147 PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
148 PyBuffer_FromMemory(void *ptr, int size)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
149 {
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
150 return buffer_from_memory(NULL, size, 0, ptr, 1);
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
151 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
152
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
153 PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
154 PyBuffer_FromReadWriteMemory(void *ptr, int size)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
155 {
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
156 return buffer_from_memory(NULL, size, 0, ptr, 0);
9278
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
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
159 PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
160 PyBuffer_New(int size)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
161 {
13861
f3d5f71ccbb4 Removing warnings found by gcc -Wall
Moshe Zadka <moshez@math.huji.ac.il>
parents: 13449
diff changeset
162 PyObject *o;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
163 PyBufferObject * b;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
164
11175
fab81df566d0 PyBuffer_New(): Raise ValueError if size is negative (the other
Fred Drake <fdrake@acm.org>
parents: 10460
diff changeset
165 if (size < 0) {
fab81df566d0 PyBuffer_New(): Raise ValueError if size is negative (the other
Fred Drake <fdrake@acm.org>
parents: 10460
diff changeset
166 PyErr_SetString(PyExc_ValueError,
fab81df566d0 PyBuffer_New(): Raise ValueError if size is negative (the other
Fred Drake <fdrake@acm.org>
parents: 10460
diff changeset
167 "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
168 return NULL;
fab81df566d0 PyBuffer_New(): Raise ValueError if size is negative (the other
Fred Drake <fdrake@acm.org>
parents: 10460
diff changeset
169 }
24898
a869d2de536f Call me anal, but there was a particular phrase that was speading to
Guido van Rossum <guido@python.org>
parents: 23972
diff changeset
170 /* Inline PyObject_New */
13861
f3d5f71ccbb4 Removing warnings found by gcc -Wall
Moshe Zadka <moshez@math.huji.ac.il>
parents: 13449
diff changeset
171 o = PyObject_MALLOC(sizeof(*b) + size);
f3d5f71ccbb4 Removing warnings found by gcc -Wall
Moshe Zadka <moshez@math.huji.ac.il>
parents: 13449
diff changeset
172 if ( o == NULL )
11175
fab81df566d0 PyBuffer_New(): Raise ValueError if size is negative (the other
Fred Drake <fdrake@acm.org>
parents: 10460
diff changeset
173 return PyErr_NoMemory();
13861
f3d5f71ccbb4 Removing warnings found by gcc -Wall
Moshe Zadka <moshez@math.huji.ac.il>
parents: 13449
diff changeset
174 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
175
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
176 b->b_base = NULL;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
177 b->b_ptr = (void *)(b + 1);
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
178 b->b_size = size;
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
179 b->b_offset = 0;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
180 b->b_readonly = 0;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
181 b->b_hash = -1;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
182
13861
f3d5f71ccbb4 Removing warnings found by gcc -Wall
Moshe Zadka <moshez@math.huji.ac.il>
parents: 13449
diff changeset
183 return o;
9278
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 /* Methods */
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
187
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
188 static PyObject *
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
189 buffer_new(PyTypeObject *type, PyObject *args, PyObject *kw)
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
190 {
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
191 PyObject *ob;
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
192 int offset = 0;
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
193 int size = Py_END_OF_BUFFER;
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
194
35450
97c97194e64b Disallow keyword arguments for type constructors that don't use them
Georg Brandl <georg@python.org>
parents: 33560
diff changeset
195 if (!_PyArg_NoKeywords("buffer()", kw))
97c97194e64b Disallow keyword arguments for type constructors that don't use them
Georg Brandl <georg@python.org>
parents: 33560
diff changeset
196 return NULL;
97c97194e64b Disallow keyword arguments for type constructors that don't use them
Georg Brandl <georg@python.org>
parents: 33560
diff changeset
197
97c97194e64b Disallow keyword arguments for type constructors that don't use them
Georg Brandl <georg@python.org>
parents: 33560
diff changeset
198 if (!PyArg_ParseTuple(args, "O|ii:buffer", &ob, &offset, &size))
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
199 return NULL;
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
200 return PyBuffer_FromObject(ob, offset, size);
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
201 }
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
202
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
203 PyDoc_STRVAR(buffer_doc,
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
204 "buffer(object [, offset[, size]])\n\
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
205 \n\
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
206 Create a new buffer object which references the given object.\n\
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
207 The buffer will reference a slice of the target object from the\n\
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
208 start of the object (or at the specified offset). The slice will\n\
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
209 extend to the end of the target object (or with the specified size).");
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
210
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
211
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
212 static void
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
213 buffer_dealloc(PyBufferObject *self)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
214 {
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
215 Py_XDECREF(self->b_base);
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 11175
diff changeset
216 PyObject_DEL(self);
9278
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
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
219 static int
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
220 buffer_compare(PyBufferObject *self, PyBufferObject *other)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
221 {
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
222 void *p1, *p2;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
223 int len_self, len_other, min_len, cmp;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
224
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
225 if (!get_buf(self, &p1, &len_self))
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
226 return -1;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
227 if (!get_buf(other, &p2, &len_other))
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
228 return -1;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
229 min_len = (len_self < len_other) ? len_self : len_other;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
230 if (min_len > 0) {
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
231 cmp = memcmp(p1, p2, min_len);
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
232 if (cmp != 0)
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
233 return cmp;
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 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
236 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
237
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
238 static PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
239 buffer_repr(PyBufferObject *self)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
240 {
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
241 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
242
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
243 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
244 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
245 status,
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
246 self->b_ptr,
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
247 self->b_size,
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
248 self);
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
249 else
19476
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
250 return PyString_FromFormat(
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
251 "<%s buffer for %p, size %d, offset %d at %p>",
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
252 status,
13210
ff243b0f16ee Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 12576
diff changeset
253 self->b_base,
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
254 self->b_size,
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
255 self->b_offset,
13210
ff243b0f16ee Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 12576
diff changeset
256 self);
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
257 }
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 static long
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
260 buffer_hash(PyBufferObject *self)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
261 {
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
262 void *ptr;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
263 int size;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
264 register int len;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
265 register unsigned char *p;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
266 register long x;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
267
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
268 if ( self->b_hash != -1 )
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
269 return self->b_hash;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
270
31639
047148089c35 Document one of the many problems with the buffer object.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31638
diff changeset
271 /* XXX potential bugs here, a readonly buffer does not imply that the
047148089c35 Document one of the many problems with the buffer object.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31638
diff changeset
272 * underlying memory is immutable. b_readonly is a necessary but not
047148089c35 Document one of the many problems with the buffer object.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31638
diff changeset
273 * sufficient condition for a buffer to be hashable. Perhaps it would
047148089c35 Document one of the many problems with the buffer object.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31638
diff changeset
274 * be better to only allow hashing if the underlying object is known to
047148089c35 Document one of the many problems with the buffer object.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31638
diff changeset
275 * be immutable (e.g. PyString_Check() is true). Another idea would
047148089c35 Document one of the many problems with the buffer object.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31638
diff changeset
276 * be to call tp_hash on the underlying object and see if it raises
047148089c35 Document one of the many problems with the buffer object.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31638
diff changeset
277 * an error. */
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
278 if ( !self->b_readonly )
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
279 {
31639
047148089c35 Document one of the many problems with the buffer object.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31638
diff changeset
280 PyErr_SetString(PyExc_TypeError,
047148089c35 Document one of the many problems with the buffer object.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31638
diff changeset
281 "writable buffers are not hashable");
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
282 return -1;
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
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
285 if (!get_buf(self, &ptr, &size))
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
286 return -1;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
287 p = (unsigned char *) ptr;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
288 len = size;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
289 x = *p << 7;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
290 while (--len >= 0)
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
291 x = (1000003*x) ^ *p++;
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
292 x ^= size;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
293 if (x == -1)
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
294 x = -2;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
295 self->b_hash = x;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
296 return x;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
297 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
298
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
299 static PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
300 buffer_str(PyBufferObject *self)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
301 {
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
302 void *ptr;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
303 int size;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
304 if (!get_buf(self, &ptr, &size))
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
305 return NULL;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
306 return PyString_FromStringAndSize(ptr, size);
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
307 }
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 /* Sequence methods */
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
310
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
311 static int
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
312 buffer_length(PyBufferObject *self)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
313 {
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
314 void *ptr;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
315 int size;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
316 if (!get_buf(self, &ptr, &size))
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
317 return -1;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
318 return size;
9278
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
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
321 static PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
322 buffer_concat(PyBufferObject *self, PyObject *other)
9278
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 PyBufferProcs *pb = other->ob_type->tp_as_buffer;
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
325 void *ptr1, *ptr2;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
326 char *p;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
327 PyObject *ob;
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
328 int size, count;
9278
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 if ( pb == NULL ||
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
331 pb->bf_getreadbuffer == NULL ||
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
332 pb->bf_getsegcount == NULL )
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
333 {
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
334 PyErr_BadArgument();
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
335 return NULL;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
336 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
337 if ( (*pb->bf_getsegcount)(other, NULL) != 1 )
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 /* ### use a different exception type/message? */
10460
62781914fadb Folded long lines.
Guido van Rossum <guido@python.org>
parents: 10427
diff changeset
340 PyErr_SetString(PyExc_TypeError,
62781914fadb Folded long lines.
Guido van Rossum <guido@python.org>
parents: 10427
diff changeset
341 "single-segment buffer object expected");
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
342 return NULL;
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
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
345 if (!get_buf(self, &ptr1, &size))
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
346 return NULL;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
347
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
348 /* optimize special case */
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
349 if ( size == 0 )
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
350 {
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
351 Py_INCREF(other);
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
352 return other;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
353 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
354
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
355 if ( (count = (*pb->bf_getreadbuffer)(other, 0, &ptr2)) < 0 )
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
356 return NULL;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
357
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
358 ob = PyString_FromStringAndSize(NULL, size + count);
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
359 p = PyString_AS_STRING(ob);
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
360 memcpy(p, ptr1, size);
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
361 memcpy(p + size, ptr2, count);
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
362
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
363 /* there is an extra byte in the string object, so this is safe */
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
364 p[size + count] = '\0';
9278
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 return ob;
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
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
369 static PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
370 buffer_repeat(PyBufferObject *self, int count)
9278
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;
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
374 void *ptr;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
375 int size;
9278
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;
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
379 if (!get_buf(self, &ptr, &size))
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
380 return NULL;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
381 ob = PyString_FromStringAndSize(NULL, size * count);
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
382 if ( ob == NULL )
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
383 return NULL;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
384
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
385 p = PyString_AS_STRING(ob);
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
386 while ( count-- )
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
387 {
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
388 memcpy(p, ptr, size);
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
389 p += size;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
390 }
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 /* 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
393 *p = '\0';
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 return ob;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
396 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
397
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
398 static PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
399 buffer_item(PyBufferObject *self, int idx)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
400 {
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
401 void *ptr;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
402 int size;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
403 if (!get_buf(self, &ptr, &size))
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
404 return NULL;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
405 if ( idx < 0 || idx >= size ) {
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
406 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
407 return NULL;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
408 }
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
409 return PyString_FromStringAndSize((char *)ptr + idx, 1);
9278
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 PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
413 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
414 {
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
415 void *ptr;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
416 int size;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
417 if (!get_buf(self, &ptr, &size))
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
418 return NULL;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
419 if ( left < 0 )
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
420 left = 0;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
421 if ( right < 0 )
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
422 right = 0;
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
423 if ( right > size )
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
424 right = size;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
425 if ( right < left )
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
426 right = left;
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
427 return PyString_FromStringAndSize((char *)ptr + left,
10460
62781914fadb Folded long lines.
Guido van Rossum <guido@python.org>
parents: 10427
diff changeset
428 right - left);
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
429 }
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 static int
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
432 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
433 {
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
434 PyBufferProcs *pb;
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
435 void *ptr1, *ptr2;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
436 int size;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
437 int count;
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 if ( self->b_readonly ) {
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
440 PyErr_SetString(PyExc_TypeError,
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
441 "buffer is read-only");
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
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
445 if (!get_buf(self, &ptr1, &size))
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
446 return -1;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
447
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
448 if (idx < 0 || idx >= size) {
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
449 PyErr_SetString(PyExc_IndexError,
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
450 "buffer assignment index out of range");
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
451 return -1;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
452 }
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 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
455 if ( pb == NULL ||
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
456 pb->bf_getreadbuffer == NULL ||
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
457 pb->bf_getsegcount == NULL )
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
458 {
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
459 PyErr_BadArgument();
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
460 return -1;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
461 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
462 if ( (*pb->bf_getsegcount)(other, NULL) != 1 )
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 /* ### use a different exception type/message? */
10460
62781914fadb Folded long lines.
Guido van Rossum <guido@python.org>
parents: 10427
diff changeset
465 PyErr_SetString(PyExc_TypeError,
62781914fadb Folded long lines.
Guido van Rossum <guido@python.org>
parents: 10427
diff changeset
466 "single-segment buffer object expected");
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
467 return -1;
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
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
470 if ( (count = (*pb->bf_getreadbuffer)(other, 0, &ptr2)) < 0 )
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
471 return -1;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
472 if ( count != 1 ) {
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
473 PyErr_SetString(PyExc_TypeError,
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
474 "right operand must be a single byte");
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
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
478 ((char *)ptr1)[idx] = *(char *)ptr2;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
479 return 0;
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
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
482 static int
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
483 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
484 {
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
485 PyBufferProcs *pb;
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
486 void *ptr1, *ptr2;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
487 int size;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
488 int slice_len;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
489 int count;
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 if ( self->b_readonly ) {
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
492 PyErr_SetString(PyExc_TypeError,
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
493 "buffer is read-only");
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
494 return -1;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
495 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
496
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
497 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
498 if ( pb == NULL ||
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
499 pb->bf_getreadbuffer == NULL ||
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
500 pb->bf_getsegcount == NULL )
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
501 {
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
502 PyErr_BadArgument();
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
503 return -1;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
504 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
505 if ( (*pb->bf_getsegcount)(other, NULL) != 1 )
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
506 {
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
507 /* ### use a different exception type/message? */
10460
62781914fadb Folded long lines.
Guido van Rossum <guido@python.org>
parents: 10427
diff changeset
508 PyErr_SetString(PyExc_TypeError,
62781914fadb Folded long lines.
Guido van Rossum <guido@python.org>
parents: 10427
diff changeset
509 "single-segment buffer object expected");
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
510 return -1;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
511 }
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
512 if (!get_buf(self, &ptr1, &size))
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
513 return -1;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
514 if ( (count = (*pb->bf_getreadbuffer)(other, 0, &ptr2)) < 0 )
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
515 return -1;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
516
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
517 if ( left < 0 )
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
518 left = 0;
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
519 else if ( left > size )
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
520 left = size;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
521 if ( right < left )
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
522 right = left;
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
523 else if ( right > size )
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
524 right = size;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
525 slice_len = right - left;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
526
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
527 if ( count != slice_len ) {
10460
62781914fadb Folded long lines.
Guido van Rossum <guido@python.org>
parents: 10427
diff changeset
528 PyErr_SetString(
62781914fadb Folded long lines.
Guido van Rossum <guido@python.org>
parents: 10427
diff changeset
529 PyExc_TypeError,
62781914fadb Folded long lines.
Guido van Rossum <guido@python.org>
parents: 10427
diff changeset
530 "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
531 return -1;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
532 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
533
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
534 if ( slice_len )
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
535 memcpy((char *)ptr1 + left, ptr2, slice_len);
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
536
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
537 return 0;
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
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
540 /* Buffer methods */
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 static int
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
543 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
544 {
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
545 int size;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
546 if ( idx != 0 ) {
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
547 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
548 "accessing non-existent buffer segment");
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
549 return -1;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
550 }
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
551 if (!get_buf(self, pp, &size))
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
552 return -1;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
553 return size;
9278
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
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
556 static int
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
557 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
558 {
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
559 if ( self->b_readonly )
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
560 {
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
561 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
562 return -1;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
563 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
564 return buffer_getreadbuf(self, idx, pp);
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
565 }
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 static int
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
568 buffer_getsegcount(PyBufferObject *self, int *lenp)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
569 {
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
570 void *ptr;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
571 int size;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
572 if (!get_buf(self, &ptr, &size))
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
573 return -1;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
574 if (lenp)
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
575 *lenp = size;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
576 return 1;
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
9305
083efa076366 Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents: 9286
diff changeset
579 static int
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
580 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
581 {
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
582 void *ptr;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
583 int size;
9305
083efa076366 Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents: 9286
diff changeset
584 if ( idx != 0 ) {
083efa076366 Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents: 9286
diff changeset
585 PyErr_SetString(PyExc_SystemError,
083efa076366 Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents: 9286
diff changeset
586 "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
587 return -1;
083efa076366 Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents: 9286
diff changeset
588 }
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
589 if (!get_buf(self, &ptr, &size))
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
590 return -1;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
591 *pp = (const char *)ptr;
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
592 return size;
9305
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
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
595
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
596 static PySequenceMethods buffer_as_sequence = {
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
597 (inquiry)buffer_length, /*sq_length*/
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
598 (binaryfunc)buffer_concat, /*sq_concat*/
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
599 (intargfunc)buffer_repeat, /*sq_repeat*/
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
600 (intargfunc)buffer_item, /*sq_item*/
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
601 (intintargfunc)buffer_slice, /*sq_slice*/
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
602 (intobjargproc)buffer_ass_item, /*sq_ass_item*/
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
603 (intintobjargproc)buffer_ass_slice, /*sq_ass_slice*/
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
604 };
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
605
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
606 static PyBufferProcs buffer_as_buffer = {
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
607 (getreadbufferproc)buffer_getreadbuf,
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
608 (getwritebufferproc)buffer_getwritebuf,
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
609 (getsegcountproc)buffer_getsegcount,
9305
083efa076366 Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents: 9286
diff changeset
610 (getcharbufferproc)buffer_getcharbuf,
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
611 };
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
612
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
613 PyTypeObject PyBuffer_Type = {
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
614 PyObject_HEAD_INIT(&PyType_Type)
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
615 0,
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
616 "buffer",
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
617 sizeof(PyBufferObject),
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
618 0,
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
619 (destructor)buffer_dealloc, /* tp_dealloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
620 0, /* tp_print */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
621 0, /* tp_getattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
622 0, /* tp_setattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
623 (cmpfunc)buffer_compare, /* tp_compare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
624 (reprfunc)buffer_repr, /* tp_repr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
625 0, /* tp_as_number */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
626 &buffer_as_sequence, /* tp_as_sequence */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
627 0, /* tp_as_mapping */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
628 (hashfunc)buffer_hash, /* tp_hash */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
629 0, /* tp_call */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
630 (reprfunc)buffer_str, /* tp_str */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
631 PyObject_GenericGetAttr, /* tp_getattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
632 0, /* tp_setattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
633 &buffer_as_buffer, /* tp_as_buffer */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
634 Py_TPFLAGS_DEFAULT, /* tp_flags */
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
635 buffer_doc, /* tp_doc */
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
636 0, /* tp_traverse */
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
637 0, /* tp_clear */
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
638 0, /* tp_richcompare */
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
639 0, /* tp_weaklistoffset */
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
640 0, /* tp_iter */
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
641 0, /* tp_iternext */
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
642 0, /* tp_methods */
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
643 0, /* tp_members */
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
644 0, /* tp_getset */
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
645 0, /* tp_base */
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
646 0, /* tp_dict */
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
647 0, /* tp_descr_get */
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
648 0, /* tp_descr_set */
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
649 0, /* tp_dictoffset */
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
650 0, /* tp_init */
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
651 0, /* tp_alloc */
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
652 buffer_new, /* tp_new */
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
653 };