blob: 3b195ba759063ec23b88be949babdba5e1d2dd03 [file] [log] [blame]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001/* Module support implementation */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003#include "allobjects.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004#include "modsupport.h"
5#include "import.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00006
7
8object *
9initmodule(name, methods)
10 char *name;
11 struct methodlist *methods;
12{
13 object *m, *d, *v;
14 struct methodlist *ml;
Guido van Rossum3f5da241990-12-20 15:06:42 +000015 char namebuf[256];
16 if ((m = add_module(name)) == NULL) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000017 fprintf(stderr, "initializing module: %s\n", name);
18 fatal("can't create a module");
19 }
20 d = getmoduledict(m);
21 for (ml = methods; ml->ml_name != NULL; ml++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +000022 sprintf(namebuf, "%s.%s", name, ml->ml_name);
23 v = newmethodobject(strdup(namebuf), ml->ml_meth,
24 (object *)NULL);
25 /* XXX The strdup'ed memory is never freed */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000026 if (v == NULL || dictinsert(d, ml->ml_name, v) != 0) {
27 fprintf(stderr, "initializing module: %s\n", name);
28 fatal("can't initialize module");
29 }
30 DECREF(v);
31 }
Guido van Rossum3f5da241990-12-20 15:06:42 +000032 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000033}
34
35
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036/* Argument list handling tools.
37 All return 1 for success, or call err_set*() and return 0 for failure */
38
39int
40getnoarg(v)
41 object *v;
42{
43 if (v != NULL) {
44 return err_badarg();
45 }
46 return 1;
47}
48
49int
50getintarg(v, a)
51 object *v;
52 int *a;
53{
54 if (v == NULL || !is_intobject(v)) {
55 return err_badarg();
56 }
57 *a = getintvalue(v);
58 return 1;
59}
60
61int
62getintintarg(v, a, b)
63 object *v;
64 int *a;
65 int *b;
66{
67 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2) {
68 return err_badarg();
69 }
70 return getintarg(gettupleitem(v, 0), a) &&
71 getintarg(gettupleitem(v, 1), b);
72}
73
74int
75getlongarg(v, a)
76 object *v;
77 long *a;
78{
79 if (v == NULL || !is_intobject(v)) {
80 return err_badarg();
81 }
82 *a = getintvalue(v);
83 return 1;
84}
85
86int
87getlonglongargs(v, a, b)
88 object *v;
89 long *a, *b;
90{
91 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2) {
92 return err_badarg();
93 }
94 return getlongarg(gettupleitem(v, 0), a) &&
95 getlongarg(gettupleitem(v, 1), b);
96}
97
98int
99getlonglongobjectargs(v, a, b, c)
100 object *v;
101 long *a, *b;
102 object **c;
103{
104 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 3) {
105 return err_badarg();
106 }
107 if (getlongarg(gettupleitem(v, 0), a) &&
108 getlongarg(gettupleitem(v, 1), b)) {
109 *c = gettupleitem(v, 2);
110 return 1;
111 }
112 else {
113 return err_badarg();
114 }
115}
116
117int
118getstrarg(v, a)
119 object *v;
120 object **a;
121{
122 if (v == NULL || !is_stringobject(v)) {
123 return err_badarg();
124 }
125 *a = v;
126 return 1;
127}
128
129int
130getstrstrarg(v, a, b)
131 object *v;
132 object **a;
133 object **b;
134{
135 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2) {
136 return err_badarg();
137 }
138 return getstrarg(gettupleitem(v, 0), a) &&
139 getstrarg(gettupleitem(v, 1), b);
140}
141
142int
143getstrstrintarg(v, a, b, c)
144 object *v;
145 object **a;
146 object **b;
147 int *c;
148{
149 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 3) {
150 return err_badarg();
151 }
152 return getstrarg(gettupleitem(v, 0), a) &&
153 getstrarg(gettupleitem(v, 1), b) &&
154 getintarg(gettupleitem(v, 2), c);
155}
156
157int
158getstrintarg(v, a, b)
159 object *v;
160 object **a;
161 int *b;
162{
163 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2) {
164 return err_badarg();
165 }
166 return getstrarg(gettupleitem(v, 0), a) &&
167 getintarg(gettupleitem(v, 1), b);
168}
169
170int
171getintstrarg(v, a, b)
172 object *v;
173 int *a;
174 object **b;
175{
176 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2) {
177 return err_badarg();
178 }
179 return getintarg(gettupleitem(v, 0), a) &&
180 getstrarg(gettupleitem(v, 1), b);
181}
182
183int
184getpointarg(v, a)
185 object *v;
186 int *a; /* [2] */
187{
188 return getintintarg(v, a, a+1);
189}
190
191int
192get3pointarg(v, a)
193 object *v;
194 int *a; /* [6] */
195{
196 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 3) {
197 return err_badarg();
198 }
199 return getpointarg(gettupleitem(v, 0), a) &&
200 getpointarg(gettupleitem(v, 1), a+2) &&
201 getpointarg(gettupleitem(v, 2), a+4);
202}
203
204int
205getrectarg(v, a)
206 object *v;
207 int *a; /* [2+2] */
208{
209 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2) {
210 return err_badarg();
211 }
212 return getpointarg(gettupleitem(v, 0), a) &&
213 getpointarg(gettupleitem(v, 1), a+2);
214}
215
216int
217getrectintarg(v, a)
218 object *v;
219 int *a; /* [4+1] */
220{
221 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2) {
222 return err_badarg();
223 }
224 return getrectarg(gettupleitem(v, 0), a) &&
225 getintarg(gettupleitem(v, 1), a+4);
226}
227
228int
229getpointintarg(v, a)
230 object *v;
231 int *a; /* [2+1] */
232{
233 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2) {
234 return err_badarg();
235 }
236 return getpointarg(gettupleitem(v, 0), a) &&
237 getintarg(gettupleitem(v, 1), a+2);
238}
239
240int
241getpointstrarg(v, a, b)
242 object *v;
243 int *a; /* [2] */
244 object **b;
245{
246 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2) {
247 return err_badarg();
248 }
249 return getpointarg(gettupleitem(v, 0), a) &&
250 getstrarg(gettupleitem(v, 1), b);
251}
252
253int
254getstrintintarg(v, a, b, c)
255 object *v;
256 object *a;
257 int *b, *c;
258{
259 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 3) {
260 return err_badarg();
261 }
262 return getstrarg(gettupleitem(v, 0), a) &&
263 getintarg(gettupleitem(v, 1), b) &&
264 getintarg(gettupleitem(v, 2), c);
265}
266
267int
268getrectpointarg(v, a)
269 object *v;
270 int *a; /* [4+2] */
271{
272 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2) {
273 return err_badarg();
274 }
275 return getrectarg(gettupleitem(v, 0), a) &&
276 getpointarg(gettupleitem(v, 1), a+4);
277}
278
279int
280getlongtuplearg(args, a, n)
281 object *args;
282 long *a; /* [n] */
283 int n;
284{
285 int i;
286 if (!is_tupleobject(args) || gettuplesize(args) != n) {
287 return err_badarg();
288 }
289 for (i = 0; i < n; i++) {
290 object *v = gettupleitem(args, i);
291 if (!is_intobject(v)) {
292 return err_badarg();
293 }
294 a[i] = getintvalue(v);
295 }
296 return 1;
297}
298
299int
300getshorttuplearg(args, a, n)
301 object *args;
302 short *a; /* [n] */
303 int n;
304{
305 int i;
306 if (!is_tupleobject(args) || gettuplesize(args) != n) {
307 return err_badarg();
308 }
309 for (i = 0; i < n; i++) {
310 object *v = gettupleitem(args, i);
311 if (!is_intobject(v)) {
312 return err_badarg();
313 }
314 a[i] = getintvalue(v);
315 }
316 return 1;
317}
318
319int
320getlonglistarg(args, a, n)
321 object *args;
322 long *a; /* [n] */
323 int n;
324{
325 int i;
326 if (!is_listobject(args) || getlistsize(args) != n) {
327 return err_badarg();
328 }
329 for (i = 0; i < n; i++) {
330 object *v = getlistitem(args, i);
331 if (!is_intobject(v)) {
332 return err_badarg();
333 }
334 a[i] = getintvalue(v);
335 }
336 return 1;
337}
338
339int
340getshortlistarg(args, a, n)
341 object *args;
342 short *a; /* [n] */
343 int n;
344{
345 int i;
346 if (!is_listobject(args) || getlistsize(args) != n) {
347 return err_badarg();
348 }
349 for (i = 0; i < n; i++) {
350 object *v = getlistitem(args, i);
351 if (!is_intobject(v)) {
352 return err_badarg();
353 }
354 a[i] = getintvalue(v);
355 }
356 return 1;
357}