blob: 9c5dbf93c7506a25805140b931dc7c6c5da60fc9 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000025/* Module support implementation */
26
Guido van Rossum3f5da241990-12-20 15:06:42 +000027#include "allobjects.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000028#include "import.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000029
Guido van Rossum1d5735e1994-08-30 08:27:36 +000030#ifdef MPW /* MPW pushes 'extended' for float and double types with varargs */
31typedef extended va_double;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000032#else
Guido van Rossum1d5735e1994-08-30 08:27:36 +000033typedef double va_double;
34#endif
35
Guido van Rossum50620fa1995-01-07 12:43:18 +000036/* initmodule3() has two additional parameters:
37 - doc is the documentation string;
38 - passthrough is passed as self to functions defined in the module.
39*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +000040
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000041object *
Guido van Rossum50620fa1995-01-07 12:43:18 +000042initmodule3(name, methods, doc, passthrough)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000043 char *name;
44 struct methodlist *methods;
Guido van Rossum50620fa1995-01-07 12:43:18 +000045 char *doc;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000046 object *passthrough;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000047{
48 object *m, *d, *v;
49 struct methodlist *ml;
Guido van Rossum3f5da241990-12-20 15:06:42 +000050 if ((m = add_module(name)) == NULL) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000051 fprintf(stderr, "initializing module: %s\n", name);
52 fatal("can't create a module");
53 }
54 d = getmoduledict(m);
55 for (ml = methods; ml->ml_name != NULL; ml++) {
Guido van Rossum50620fa1995-01-07 12:43:18 +000056 v = newmethodobject(ml, passthrough);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057 if (v == NULL || dictinsert(d, ml->ml_name, v) != 0) {
58 fprintf(stderr, "initializing module: %s\n", name);
59 fatal("can't initialize module");
60 }
61 DECREF(v);
62 }
Guido van Rossum50620fa1995-01-07 12:43:18 +000063 if (doc != NULL) {
64 v = newstringobject(doc);
65 if (v == NULL || dictinsert(d, "__doc__", v) != 0)
66 fatal("can't add doc string");
67 DECREF(v);
68 }
Guido van Rossum3f5da241990-12-20 15:06:42 +000069 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000070}
71
Guido van Rossum1d5735e1994-08-30 08:27:36 +000072/* The standard initmodule() passes NULL for 'self' */
73
74object *
75initmodule(name, methods)
76 char *name;
77 struct methodlist *methods;
78{
Guido van Rossum50620fa1995-01-07 12:43:18 +000079 return initmodule3(name, methods, (char *)NULL, (object *)NULL);
Guido van Rossum1d5735e1994-08-30 08:27:36 +000080}
81
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000082
Guido van Rossumbf80e541993-02-08 15:49:17 +000083/* Helper for mkvalue() to scan the length of a format */
Guido van Rossumfc61adb1992-04-13 15:53:41 +000084
85static int countformat PROTO((char *format, int endchar));
86static int countformat(format, endchar)
87 char *format;
88 int endchar;
89{
90 int count = 0;
91 int level = 0;
92 while (level > 0 || *format != endchar) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +000093 switch (*format) {
94 case '\0':
Guido van Rossumfc61adb1992-04-13 15:53:41 +000095 /* Premature end */
96 err_setstr(SystemError, "unmatched paren in format");
97 return -1;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000098 case '(':
99 case '[':
100 case '{':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000101 if (level == 0)
102 count++;
103 level++;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000104 break;
105 case ')':
106 case ']':
107 case '}':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000108 level--;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000109 break;
110 case '#':
111 case ',':
112 case ':':
113 case ' ':
114 case '\t':
115 break;
116 default:
117 if (level == 0)
118 count++;
119 }
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000120 format++;
121 }
122 return count;
123}
124
125
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000126/* Generic function to create a value -- the inverse of getargs() */
127/* After an original idea and first implementation by Steven Miale */
128
129static object *do_mktuple PROTO((char**, va_list *, int, int));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000130static object *do_mklist PROTO((char**, va_list *, int, int));
131static object *do_mkdict PROTO((char**, va_list *, int, int));
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000132static object *do_mkvalue PROTO((char**, va_list *));
133
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000134
135static object *
136do_mkdict(p_format, p_va, endchar, n)
137 char **p_format;
138 va_list *p_va;
139 int endchar;
140 int n;
141{
142 object *d;
143 int i;
144 if (n < 0)
145 return NULL;
146 if ((d = newdictobject()) == NULL)
147 return NULL;
148 for (i = 0; i < n; i+= 2) {
149 object *k, *v;
150 k = do_mkvalue(p_format, p_va);
151 if (k == NULL) {
152 DECREF(d);
153 return NULL;
154 }
155 v = do_mkvalue(p_format, p_va);
156 if (v == NULL) {
157 DECREF(k);
158 DECREF(d);
159 return NULL;
160 }
161 if (dict2insert(d, k, v) < 0) {
162 DECREF(k);
163 DECREF(v);
164 DECREF(d);
165 return NULL;
166 }
167 }
168 if (d != NULL && **p_format != endchar) {
169 DECREF(d);
170 d = NULL;
171 err_setstr(SystemError, "Unmatched paren in format");
172 }
173 else if (endchar)
174 ++*p_format;
175 return d;
176}
177
178static object *
179do_mklist(p_format, p_va, endchar, n)
180 char **p_format;
181 va_list *p_va;
182 int endchar;
183 int n;
184{
185 object *v;
186 int i;
187 if (n < 0)
188 return NULL;
189 if ((v = newlistobject(n)) == NULL)
190 return NULL;
191 for (i = 0; i < n; i++) {
192 object *w = do_mkvalue(p_format, p_va);
193 if (w == NULL) {
194 DECREF(v);
195 return NULL;
196 }
197 setlistitem(v, i, w);
198 }
199 if (v != NULL && **p_format != endchar) {
200 DECREF(v);
201 v = NULL;
202 err_setstr(SystemError, "Unmatched paren in format");
203 }
204 else if (endchar)
205 ++*p_format;
206 return v;
207}
208
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000209static object *
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000210do_mktuple(p_format, p_va, endchar, n)
211 char **p_format;
212 va_list *p_va;
213 int endchar;
214 int n;
215{
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000216 object *v;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000217 int i;
218 if (n < 0)
219 return NULL;
220 if ((v = newtupleobject(n)) == NULL)
221 return NULL;
222 for (i = 0; i < n; i++) {
223 object *w = do_mkvalue(p_format, p_va);
224 if (w == NULL) {
225 DECREF(v);
226 return NULL;
227 }
228 settupleitem(v, i, w);
229 }
230 if (v != NULL && **p_format != endchar) {
231 DECREF(v);
232 v = NULL;
233 err_setstr(SystemError, "Unmatched paren in format");
234 }
235 else if (endchar)
236 ++*p_format;
237 return v;
238}
239
240static object *
Guido van Rossum899dcf31992-05-15 11:04:59 +0000241do_mkvalue(p_format, p_va)
242 char **p_format;
243 va_list *p_va;
244{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000245 for (;;) {
246 switch (*(*p_format)++) {
247 case '(':
248 return do_mktuple(p_format, p_va, ')',
249 countformat(*p_format, ')'));
250
251 case '[':
252 return do_mklist(p_format, p_va, ']',
253 countformat(*p_format, ']'));
254
255 case '{':
256 return do_mkdict(p_format, p_va, '}',
257 countformat(*p_format, '}'));
258
259 case 'b':
260 case 'h':
261 case 'i':
262 return newintobject((long)va_arg(*p_va, int));
263
264 case 'l':
265 return newintobject((long)va_arg(*p_va, long));
266
267 case 'f':
268 case 'd':
269 return newfloatobject((double)va_arg(*p_va, double));
270
271 case 'c':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000272 {
273 char p[1];
274 p[0] = va_arg(*p_va, int);
275 return newsizedstringobject(p, 1);
276 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000277
278 case 's':
279 case 'z':
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000280 {
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000281 object *v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000282 char *str = va_arg(*p_va, char *);
283 int n;
284 if (**p_format == '#') {
285 ++*p_format;
286 n = va_arg(*p_va, int);
287 }
288 else
289 n = -1;
290 if (str == NULL) {
291 v = None;
292 INCREF(v);
293 }
294 else {
295 if (n < 0)
296 n = strlen(str);
297 v = newsizedstringobject(str, n);
298 }
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000299 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000300 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000301
302 case 'S':
303 case 'O':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000304 {
305 object *v;
306 v = va_arg(*p_va, object *);
307 if (v != NULL)
308 INCREF(v);
309 else if (!err_occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000310 /* If a NULL was passed
311 * because a call that should
312 * have constructed a value
313 * failed, that's OK, and we
314 * pass the error on; but if
315 * no error occurred it's not
316 * clear that the caller knew
317 * what she was doing. */
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000318 err_setstr(SystemError,
319 "NULL object passed to mkvalue");
320 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000321 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000322
323 case ':':
324 case ',':
325 case ' ':
326 case '\t':
327 break;
328
329 default:
330 err_setstr(SystemError,
331 "bad format char passed to mkvalue");
332 return NULL;
333
334 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000335 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000336}
337
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000338
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000339#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000340/* VARARGS 2 */
341object *mkvalue(char *format, ...)
342#else
343/* VARARGS */
344object *mkvalue(va_alist) va_dcl
345#endif
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000346{
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000347 va_list va;
348 object* retval;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000349#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000350 va_start(va, format);
351#else
352 char *format;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000353 va_start(va);
354 format = va_arg(va, char *);
355#endif
Guido van Rossume5372401993-03-16 12:15:04 +0000356 retval = vmkvalue(format, va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000357 va_end(va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000358 return retval;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000359}
Guido van Rossume5372401993-03-16 12:15:04 +0000360
361object *
362vmkvalue(format, va)
363 char *format;
364 va_list va;
365{
366 char *f = format;
367 int n = countformat(f, '\0');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000368 va_list lva;
369
370#ifdef VA_LIST_IS_ARRAY
371 memcpy(lva, va, sizeof(va_list));
372#else
373 lva = va;
374#endif
375
Guido van Rossume5372401993-03-16 12:15:04 +0000376 if (n < 0)
377 return NULL;
378 if (n == 0) {
379 INCREF(None);
380 return None;
381 }
382 if (n == 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000383 return do_mkvalue(&f, &lva);
384 return do_mktuple(&f, &lva, '\0', n);
385}
386
387
388#ifdef HAVE_STDARG_PROTOTYPES
389object *
390PyEval_CallFunction(object *obj, char *format, ...)
391#else
392object *
393PyEval_CallFunction(obj, format, va_alist)
394 object *obj;
395 char *format;
396 va_dcl
397#endif
398{
399 va_list vargs;
400 object *args;
401 object *res;
402
403#ifdef HAVE_STDARG_PROTOTYPES
404 va_start(vargs, format);
405#else
406 va_start(vargs);
407#endif
408
409 args = vmkvalue(format, vargs);
410 va_end(vargs);
411
412 if (args == NULL)
413 return NULL;
414
415 res = call_object(obj, args);
416 DECREF(args);
417
418 return res;
419}
420
421
422#ifdef HAVE_STDARG_PROTOTYPES
423object *
424PyEval_CallMethod(object *obj, char *method, char *format, ...)
425#else
426object *
427PyEval_CallMethod(obj, method, format, va_alist)
428 object *obj;
429 char *method;
430 char *format;
431 va_dcl
432#endif
433{
434 va_list vargs;
435 object *meth;
436 object *args;
437 object *res;
438
439 meth = getattr(obj, method);
440 if (meth == NULL)
441 return NULL;
442
443#ifdef HAVE_STDARG_PROTOTYPES
444 va_start(vargs, format);
445#else
446 va_start(vargs);
447#endif
448
449 args = vmkvalue(format, vargs);
450 va_end(vargs);
451
452 if (args == NULL) {
453 DECREF(meth);
454 return NULL;
455 }
456
457 res = call_object(meth, args);
458 DECREF(meth);
459 DECREF(args);
460
461 return res;
Guido van Rossume5372401993-03-16 12:15:04 +0000462}