2 /* Map C struct members to Python object attributes */
6 #include "structmember.h"
9 listmembers(struct memberlist
*mlist
)
13 for (n
= 0; mlist
[n
].name
!= NULL
; n
++)
17 for (i
= 0; i
< n
; i
++)
19 PyString_FromString(mlist
[i
].name
));
20 if (PyErr_Occurred()) {
32 PyMember_Get(char *addr
, struct memberlist
*mlist
, char *name
)
36 if (strcmp(name
, "__members__") == 0)
37 return listmembers(mlist
);
38 for (l
= mlist
; l
->name
!= NULL
; l
++) {
39 if (strcmp(l
->name
, name
) == 0) {
44 v
= PyInt_FromLong((long)
45 (((*(char*)addr
& 0xff)
49 v
= PyInt_FromLong((long) *(char*)addr
& 0xff);
52 v
= PyInt_FromLong((long) *(short*)addr
);
55 v
= PyInt_FromLong((long)
56 *(unsigned short*)addr
);
59 v
= PyInt_FromLong((long) *(int*)addr
);
62 v
= PyInt_FromLong((long)
63 *(unsigned int*)addr
);
66 v
= PyInt_FromLong(*(long*)addr
);
69 v
= PyLong_FromDouble((double)
70 *(unsigned long*)addr
);
73 v
= PyFloat_FromDouble((double)*(float*)addr
);
76 v
= PyFloat_FromDouble(*(double*)addr
);
79 if (*(char**)addr
== NULL
) {
84 v
= PyString_FromString(*(char**)addr
);
86 case T_STRING_INPLACE
:
87 v
= PyString_FromString((char*)addr
);
91 if (*(char**)addr
== NULL
) {
96 v
= PyString_FromStringAndSize(
98 **(unsigned char**)addr
);
100 case T_PSTRING_INPLACE
:
101 v
= PyString_FromStringAndSize(
103 *(unsigned char*)addr
);
105 #endif /* macintosh */
107 v
= PyString_FromStringAndSize((char*)addr
, 1);
110 v
= *(PyObject
**)addr
;
116 PyErr_SetString(PyExc_SystemError
,
117 "bad memberlist type");
124 PyErr_SetString(PyExc_AttributeError
, name
);
129 PyMember_Set(char *addr
, struct memberlist
*mlist
, char *name
, PyObject
*v
)
131 struct memberlist
*l
;
134 for (l
= mlist
; l
->name
!= NULL
; l
++) {
135 if (strcmp(l
->name
, name
) == 0) {
137 if (l
->readonly
|| l
->type
== T_STRING
||
138 l
->type
== T_PSTRING
)
141 if (l
->readonly
|| l
->type
== T_STRING
) {
142 #endif /* macintosh */
143 PyErr_SetString(PyExc_TypeError
,
144 "readonly attribute");
147 if (v
== NULL
&& l
->type
!= T_OBJECT
) {
148 PyErr_SetString(PyExc_TypeError
,
149 "can't delete numeric/char attribute");
156 if (!PyInt_Check(v
)) {
160 *(char*)addr
= (char) PyInt_AsLong(v
);
164 if (!PyInt_Check(v
)) {
168 *(short*)addr
= (short) PyInt_AsLong(v
);
172 if (!PyInt_Check(v
)) {
176 *(int*)addr
= (int) PyInt_AsLong(v
);
179 if (!PyInt_Check(v
)) {
183 *(long*)addr
= PyInt_AsLong(v
);
187 *(long*)addr
= PyInt_AsLong(v
);
188 else if (PyLong_Check(v
))
189 *(long*)addr
= PyLong_AsLong(v
);
198 (float) PyInt_AsLong(v
);
199 else if (PyFloat_Check(v
))
201 (float) PyFloat_AsDouble(v
);
210 (double) PyInt_AsLong(v
);
211 else if (PyFloat_Check(v
))
212 *(double*)addr
= PyFloat_AsDouble(v
);
220 oldv
= *(PyObject
**)addr
;
221 *(PyObject
**)addr
= v
;
225 if (PyString_Check(v
) &&
226 PyString_Size(v
) == 1) {
228 PyString_AsString(v
)[0];
236 PyErr_SetString(PyExc_SystemError
,
237 "bad memberlist type");
244 PyErr_SetString(PyExc_AttributeError
, name
);