blob: b5f9bc3efb12636eda417e97061af7f7aaeb2796 [file] [log] [blame]
Guido van Rossum3f5da241990-12-20 15:06:42 +00001/* Map C struct members to Python object attributes */
2
3#include "allobjects.h"
4
5#include "structmember.h"
6
7object *
8getmember(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
61int
62setmember(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);
Guido van Rossum73531a31990-12-20 23:12:40 +0000133 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000134}