|
86
|
1 /* Map C struct members to Python object attributes */
|
|
|
2
|
|
|
3 #include "allobjects.h"
|
|
|
4
|
|
|
5 #include "structmember.h"
|
|
|
6
|
|
|
7 object *
|
|
|
8 getmember(addr, mlist, name)
|
|
|
9 char *addr;
|
|
|
10 struct memberlist *mlist;
|
|
|
11 char *name;
|
|
|
12 {
|
|
|
13 struct memberlist *l;
|
|
|
14
|
|
|
15 for (l = mlist; l->name != NULL; l++) {
|
|
|
16 if (strcmp(l->name, name) == 0) {
|
|
|
17 object *v;
|
|
|
18 addr += l->offset;
|
|
|
19 switch (l->type) {
|
|
|
20 case T_SHORT:
|
|
|
21 v = newintobject((long) *(short*)addr);
|
|
|
22 break;
|
|
|
23 case T_INT:
|
|
|
24 v = newintobject((long) *(int*)addr);
|
|
|
25 break;
|
|
|
26 case T_LONG:
|
|
|
27 v = newintobject(*(long*)addr);
|
|
|
28 break;
|
|
|
29 case T_FLOAT:
|
|
|
30 v = newfloatobject((double)*(float*)addr);
|
|
|
31 break;
|
|
|
32 case T_DOUBLE:
|
|
|
33 v = newfloatobject(*(double*)addr);
|
|
|
34 break;
|
|
|
35 case T_STRING:
|
|
|
36 if (*(char**)addr == NULL) {
|
|
|
37 INCREF(None);
|
|
|
38 v = None;
|
|
|
39 }
|
|
|
40 else
|
|
|
41 v = newstringobject(*(char**)addr);
|
|
|
42 break;
|
|
|
43 case T_OBJECT:
|
|
|
44 v = *(object **)addr;
|
|
|
45 if (v == NULL)
|
|
|
46 v = None;
|
|
|
47 INCREF(v);
|
|
|
48 break;
|
|
|
49 default:
|
|
|
50 err_setstr(SystemError, "bad memberlist type");
|
|
|
51 v = NULL;
|
|
|
52 }
|
|
|
53 return v;
|
|
|
54 }
|
|
|
55 }
|
|
|
56
|
|
|
57 err_setstr(NameError, name);
|
|
|
58 return NULL;
|
|
|
59 }
|
|
|
60
|
|
|
61 int
|
|
|
62 setmember(addr, mlist, name, v)
|
|
|
63 char *addr;
|
|
|
64 struct memberlist *mlist;
|
|
|
65 char *name;
|
|
|
66 object *v;
|
|
|
67 {
|
|
|
68 struct memberlist *l;
|
|
|
69
|
|
|
70 for (l = mlist; l->name != NULL; l++) {
|
|
|
71 if (strcmp(l->name, name) == 0) {
|
|
|
72 if (l->readonly || l->type == T_STRING) {
|
|
|
73 err_setstr(RuntimeError, "readonly attribute");
|
|
|
74 return -1;
|
|
|
75 }
|
|
|
76 addr += l->offset;
|
|
|
77 switch (l->type) {
|
|
|
78 case T_SHORT:
|
|
|
79 if (!is_intobject(v)) {
|
|
|
80 err_badarg();
|
|
|
81 return -1;
|
|
|
82 }
|
|
|
83 *(short*)addr = getintvalue(v);
|
|
|
84 break;
|
|
|
85 case T_INT:
|
|
|
86 if (!is_intobject(v)) {
|
|
|
87 err_badarg();
|
|
|
88 return -1;
|
|
|
89 }
|
|
|
90 *(int*)addr = getintvalue(v);
|
|
|
91 break;
|
|
|
92 case T_LONG:
|
|
|
93 if (!is_intobject(v)) {
|
|
|
94 err_badarg();
|
|
|
95 return -1;
|
|
|
96 }
|
|
|
97 *(long*)addr = getintvalue(v);
|
|
|
98 break;
|
|
|
99 case T_FLOAT:
|
|
|
100 if (is_intobject(v))
|
|
|
101 *(float*)addr = getintvalue(v);
|
|
|
102 else if (is_floatobject(v))
|
|
|
103 *(float*)addr = getfloatvalue(v);
|
|
|
104 else {
|
|
|
105 err_badarg();
|
|
|
106 return -1;
|
|
|
107 }
|
|
|
108 break;
|
|
|
109 case T_DOUBLE:
|
|
|
110 if (is_intobject(v))
|
|
|
111 *(double*)addr = getintvalue(v);
|
|
|
112 else if (is_floatobject(v))
|
|
|
113 *(double*)addr = getfloatvalue(v);
|
|
|
114 else {
|
|
|
115 err_badarg();
|
|
|
116 return -1;
|
|
|
117 }
|
|
|
118 break;
|
|
|
119 case T_OBJECT:
|
|
|
120 XDECREF(*(object **)addr);
|
|
|
121 XINCREF(v);
|
|
|
122 *(object **)addr = v;
|
|
|
123 break;
|
|
|
124 default:
|
|
|
125 err_setstr(SystemError, "bad memberlist type");
|
|
|
126 return -1;
|
|
|
127 }
|
|
|
128 return 0;
|
|
|
129 }
|
|
|
130 }
|
|
|
131
|
|
|
132 err_setstr(NameError, name);
|
|
95
|
133 return -1;
|
|
86
|
134 }
|