blob: 63f5267cc38b0a1cbab92af2ac6c6e215e36421f [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 Rossum970a0a21995-01-09 17:47:20 +000036/* initmodule4() parameters:
37 - name is the module name
38 - methods is the list of top-level functions
39 - doc is the documentation string
40 - passthrough is passed as self to functions defined in the module
41 - api_version is the value of PYTHON_API_VERSION at the time the
42 module was compiled
Guido van Rossum50620fa1995-01-07 12:43:18 +000043*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +000044
Guido van Rossum970a0a21995-01-09 17:47:20 +000045static char api_version_warning[] =
46"WARNING: Python C API version mismatch for module %s:\n\
47 This Python has API version %d, module %s has version %s.\n";
48
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000049object *
Guido van Rossum970a0a21995-01-09 17:47:20 +000050initmodule4(name, methods, doc, passthrough, module_api_version)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000051 char *name;
52 struct methodlist *methods;
Guido van Rossum50620fa1995-01-07 12:43:18 +000053 char *doc;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000054 object *passthrough;
Guido van Rossum970a0a21995-01-09 17:47:20 +000055 int module_api_version;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000056{
57 object *m, *d, *v;
58 struct methodlist *ml;
Guido van Rossum970a0a21995-01-09 17:47:20 +000059 if (module_api_version != PYTHON_API_VERSION)
60 fprintf(stderr, api_version_warning,
61 name, PYTHON_API_VERSION, name, module_api_version);
Guido van Rossum3f5da241990-12-20 15:06:42 +000062 if ((m = add_module(name)) == NULL) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000063 fprintf(stderr, "initializing module: %s\n", name);
64 fatal("can't create a module");
65 }
66 d = getmoduledict(m);
67 for (ml = methods; ml->ml_name != NULL; ml++) {
Guido van Rossum50620fa1995-01-07 12:43:18 +000068 v = newmethodobject(ml, passthrough);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000069 if (v == NULL || dictinsert(d, ml->ml_name, v) != 0) {
70 fprintf(stderr, "initializing module: %s\n", name);
71 fatal("can't initialize module");
72 }
73 DECREF(v);
74 }
Guido van Rossum50620fa1995-01-07 12:43:18 +000075 if (doc != NULL) {
76 v = newstringobject(doc);
77 if (v == NULL || dictinsert(d, "__doc__", v) != 0)
78 fatal("can't add doc string");
79 DECREF(v);
80 }
Guido van Rossum3f5da241990-12-20 15:06:42 +000081 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000082}
83
84
Guido van Rossumbf80e541993-02-08 15:49:17 +000085/* Helper for mkvalue() to scan the length of a format */
Guido van Rossumfc61adb1992-04-13 15:53:41 +000086
87static int countformat PROTO((char *format, int endchar));
88static int countformat(format, endchar)
89 char *format;
90 int endchar;
91{
92 int count = 0;
93 int level = 0;
94 while (level > 0 || *format != endchar) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +000095 switch (*format) {
96 case '\0':
Guido van Rossumfc61adb1992-04-13 15:53:41 +000097 /* Premature end */
98 err_setstr(SystemError, "unmatched paren in format");
99 return -1;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000100 case '(':
101 case '[':
102 case '{':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000103 if (level == 0)
104 count++;
105 level++;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000106 break;
107 case ')':
108 case ']':
109 case '}':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000110 level--;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000111 break;
112 case '#':
Guido van Rossumd1b93931995-01-20 16:56:02 +0000113 case '&':
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000114 case ',':
115 case ':':
116 case ' ':
117 case '\t':
118 break;
119 default:
120 if (level == 0)
121 count++;
122 }
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000123 format++;
124 }
125 return count;
126}
127
128
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000129/* Generic function to create a value -- the inverse of getargs() */
130/* After an original idea and first implementation by Steven Miale */
131
132static object *do_mktuple PROTO((char**, va_list *, int, int));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000133static object *do_mklist PROTO((char**, va_list *, int, int));
134static object *do_mkdict PROTO((char**, va_list *, int, int));
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000135static object *do_mkvalue PROTO((char**, va_list *));
136
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000137
138static object *
139do_mkdict(p_format, p_va, endchar, n)
140 char **p_format;
141 va_list *p_va;
142 int endchar;
143 int n;
144{
145 object *d;
146 int i;
147 if (n < 0)
148 return NULL;
149 if ((d = newdictobject()) == NULL)
150 return NULL;
151 for (i = 0; i < n; i+= 2) {
152 object *k, *v;
153 k = do_mkvalue(p_format, p_va);
154 if (k == NULL) {
155 DECREF(d);
156 return NULL;
157 }
158 v = do_mkvalue(p_format, p_va);
159 if (v == NULL) {
160 DECREF(k);
161 DECREF(d);
162 return NULL;
163 }
164 if (dict2insert(d, k, v) < 0) {
165 DECREF(k);
166 DECREF(v);
167 DECREF(d);
168 return NULL;
169 }
170 }
171 if (d != NULL && **p_format != endchar) {
172 DECREF(d);
173 d = NULL;
174 err_setstr(SystemError, "Unmatched paren in format");
175 }
176 else if (endchar)
177 ++*p_format;
178 return d;
179}
180
181static object *
182do_mklist(p_format, p_va, endchar, n)
183 char **p_format;
184 va_list *p_va;
185 int endchar;
186 int n;
187{
188 object *v;
189 int i;
190 if (n < 0)
191 return NULL;
192 if ((v = newlistobject(n)) == NULL)
193 return NULL;
194 for (i = 0; i < n; i++) {
195 object *w = do_mkvalue(p_format, p_va);
196 if (w == NULL) {
197 DECREF(v);
198 return NULL;
199 }
200 setlistitem(v, i, w);
201 }
202 if (v != NULL && **p_format != endchar) {
203 DECREF(v);
204 v = NULL;
205 err_setstr(SystemError, "Unmatched paren in format");
206 }
207 else if (endchar)
208 ++*p_format;
209 return v;
210}
211
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000212static object *
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000213do_mktuple(p_format, p_va, endchar, n)
214 char **p_format;
215 va_list *p_va;
216 int endchar;
217 int n;
218{
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000219 object *v;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000220 int i;
221 if (n < 0)
222 return NULL;
223 if ((v = newtupleobject(n)) == NULL)
224 return NULL;
225 for (i = 0; i < n; i++) {
226 object *w = do_mkvalue(p_format, p_va);
227 if (w == NULL) {
228 DECREF(v);
229 return NULL;
230 }
231 settupleitem(v, i, w);
232 }
233 if (v != NULL && **p_format != endchar) {
234 DECREF(v);
235 v = NULL;
236 err_setstr(SystemError, "Unmatched paren in format");
237 }
238 else if (endchar)
239 ++*p_format;
240 return v;
241}
242
243static object *
Guido van Rossum899dcf31992-05-15 11:04:59 +0000244do_mkvalue(p_format, p_va)
245 char **p_format;
246 va_list *p_va;
247{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000248 for (;;) {
249 switch (*(*p_format)++) {
250 case '(':
251 return do_mktuple(p_format, p_va, ')',
252 countformat(*p_format, ')'));
253
254 case '[':
255 return do_mklist(p_format, p_va, ']',
256 countformat(*p_format, ']'));
257
258 case '{':
259 return do_mkdict(p_format, p_va, '}',
260 countformat(*p_format, '}'));
261
262 case 'b':
263 case 'h':
264 case 'i':
265 return newintobject((long)va_arg(*p_va, int));
266
267 case 'l':
268 return newintobject((long)va_arg(*p_va, long));
269
270 case 'f':
271 case 'd':
Guido van Rossumd1b93931995-01-20 16:56:02 +0000272 return newfloatobject((double)va_arg(*p_va, va_double));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000273
274 case 'c':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000275 {
276 char p[1];
277 p[0] = va_arg(*p_va, int);
278 return newsizedstringobject(p, 1);
279 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000280
281 case 's':
282 case 'z':
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000283 {
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000284 object *v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000285 char *str = va_arg(*p_va, char *);
286 int n;
287 if (**p_format == '#') {
288 ++*p_format;
289 n = va_arg(*p_va, int);
290 }
291 else
292 n = -1;
293 if (str == NULL) {
294 v = None;
295 INCREF(v);
296 }
297 else {
298 if (n < 0)
299 n = strlen(str);
300 v = newsizedstringobject(str, n);
301 }
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000302 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000303 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000304
305 case 'S':
306 case 'O':
Guido van Rossumd1b93931995-01-20 16:56:02 +0000307 if (**p_format == '&') {
Guido van Rossum59461c71995-03-09 12:10:50 +0000308 typedef object *(*converter) PROTO((void *));
Guido van Rossumd1b93931995-01-20 16:56:02 +0000309 converter func = va_arg(*p_va, converter);
310 void *arg = va_arg(*p_va, void *);
311 ++*p_format;
312 return (*func)(arg);
313 }
314 else {
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000315 object *v;
316 v = va_arg(*p_va, object *);
317 if (v != NULL)
318 INCREF(v);
319 else if (!err_occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000320 /* If a NULL was passed
321 * because a call that should
322 * have constructed a value
323 * failed, that's OK, and we
324 * pass the error on; but if
325 * no error occurred it's not
326 * clear that the caller knew
327 * what she was doing. */
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000328 err_setstr(SystemError,
329 "NULL object passed to mkvalue");
330 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000331 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000332
333 case ':':
334 case ',':
335 case ' ':
336 case '\t':
337 break;
338
339 default:
340 err_setstr(SystemError,
341 "bad format char passed to mkvalue");
342 return NULL;
343
344 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000345 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000346}
347
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000348
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000349#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000350/* VARARGS 2 */
351object *mkvalue(char *format, ...)
352#else
353/* VARARGS */
354object *mkvalue(va_alist) va_dcl
355#endif
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000356{
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000357 va_list va;
358 object* retval;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000359#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000360 va_start(va, format);
361#else
362 char *format;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000363 va_start(va);
364 format = va_arg(va, char *);
365#endif
Guido van Rossume5372401993-03-16 12:15:04 +0000366 retval = vmkvalue(format, va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000367 va_end(va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000368 return retval;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000369}
Guido van Rossume5372401993-03-16 12:15:04 +0000370
371object *
372vmkvalue(format, va)
373 char *format;
374 va_list va;
375{
376 char *f = format;
377 int n = countformat(f, '\0');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000378 va_list lva;
379
380#ifdef VA_LIST_IS_ARRAY
381 memcpy(lva, va, sizeof(va_list));
382#else
383 lva = va;
384#endif
385
Guido van Rossume5372401993-03-16 12:15:04 +0000386 if (n < 0)
387 return NULL;
388 if (n == 0) {
389 INCREF(None);
390 return None;
391 }
392 if (n == 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000393 return do_mkvalue(&f, &lva);
394 return do_mktuple(&f, &lva, '\0', n);
395}
396
397
398#ifdef HAVE_STDARG_PROTOTYPES
399object *
400PyEval_CallFunction(object *obj, char *format, ...)
401#else
402object *
403PyEval_CallFunction(obj, format, va_alist)
404 object *obj;
405 char *format;
406 va_dcl
407#endif
408{
409 va_list vargs;
410 object *args;
411 object *res;
412
413#ifdef HAVE_STDARG_PROTOTYPES
414 va_start(vargs, format);
415#else
416 va_start(vargs);
417#endif
418
419 args = vmkvalue(format, vargs);
420 va_end(vargs);
421
422 if (args == NULL)
423 return NULL;
424
425 res = call_object(obj, args);
426 DECREF(args);
427
428 return res;
429}
430
431
432#ifdef HAVE_STDARG_PROTOTYPES
433object *
Guido van Rossum2ac3bc21995-01-17 16:31:01 +0000434PyEval_CallMethod(object *obj, char *methonname, char *format, ...)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000435#else
436object *
Guido van Rossum2ac3bc21995-01-17 16:31:01 +0000437PyEval_CallMethod(obj, methonname, format, va_alist)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000438 object *obj;
Guido van Rossum2ac3bc21995-01-17 16:31:01 +0000439 char *methonname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000440 char *format;
441 va_dcl
442#endif
443{
444 va_list vargs;
445 object *meth;
446 object *args;
447 object *res;
448
Guido van Rossum2ac3bc21995-01-17 16:31:01 +0000449 meth = getattr(obj, methonname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000450 if (meth == NULL)
451 return NULL;
452
453#ifdef HAVE_STDARG_PROTOTYPES
454 va_start(vargs, format);
455#else
456 va_start(vargs);
457#endif
458
459 args = vmkvalue(format, vargs);
460 va_end(vargs);
461
462 if (args == NULL) {
463 DECREF(meth);
464 return NULL;
465 }
466
467 res = call_object(meth, args);
468 DECREF(meth);
469 DECREF(args);
470
471 return res;
Guido van Rossume5372401993-03-16 12:15:04 +0000472}