blob: 93676848df105612899df5619731e90f630a0927 [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 '#':
113 case ',':
114 case ':':
115 case ' ':
116 case '\t':
117 break;
118 default:
119 if (level == 0)
120 count++;
121 }
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000122 format++;
123 }
124 return count;
125}
126
127
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000128/* Generic function to create a value -- the inverse of getargs() */
129/* After an original idea and first implementation by Steven Miale */
130
131static object *do_mktuple PROTO((char**, va_list *, int, int));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000132static object *do_mklist PROTO((char**, va_list *, int, int));
133static object *do_mkdict PROTO((char**, va_list *, int, int));
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000134static object *do_mkvalue PROTO((char**, va_list *));
135
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000136
137static object *
138do_mkdict(p_format, p_va, endchar, n)
139 char **p_format;
140 va_list *p_va;
141 int endchar;
142 int n;
143{
144 object *d;
145 int i;
146 if (n < 0)
147 return NULL;
148 if ((d = newdictobject()) == NULL)
149 return NULL;
150 for (i = 0; i < n; i+= 2) {
151 object *k, *v;
152 k = do_mkvalue(p_format, p_va);
153 if (k == NULL) {
154 DECREF(d);
155 return NULL;
156 }
157 v = do_mkvalue(p_format, p_va);
158 if (v == NULL) {
159 DECREF(k);
160 DECREF(d);
161 return NULL;
162 }
163 if (dict2insert(d, k, v) < 0) {
164 DECREF(k);
165 DECREF(v);
166 DECREF(d);
167 return NULL;
168 }
169 }
170 if (d != NULL && **p_format != endchar) {
171 DECREF(d);
172 d = NULL;
173 err_setstr(SystemError, "Unmatched paren in format");
174 }
175 else if (endchar)
176 ++*p_format;
177 return d;
178}
179
180static object *
181do_mklist(p_format, p_va, endchar, n)
182 char **p_format;
183 va_list *p_va;
184 int endchar;
185 int n;
186{
187 object *v;
188 int i;
189 if (n < 0)
190 return NULL;
191 if ((v = newlistobject(n)) == NULL)
192 return NULL;
193 for (i = 0; i < n; i++) {
194 object *w = do_mkvalue(p_format, p_va);
195 if (w == NULL) {
196 DECREF(v);
197 return NULL;
198 }
199 setlistitem(v, i, w);
200 }
201 if (v != NULL && **p_format != endchar) {
202 DECREF(v);
203 v = NULL;
204 err_setstr(SystemError, "Unmatched paren in format");
205 }
206 else if (endchar)
207 ++*p_format;
208 return v;
209}
210
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000211static object *
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000212do_mktuple(p_format, p_va, endchar, n)
213 char **p_format;
214 va_list *p_va;
215 int endchar;
216 int n;
217{
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000218 object *v;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000219 int i;
220 if (n < 0)
221 return NULL;
222 if ((v = newtupleobject(n)) == NULL)
223 return NULL;
224 for (i = 0; i < n; i++) {
225 object *w = do_mkvalue(p_format, p_va);
226 if (w == NULL) {
227 DECREF(v);
228 return NULL;
229 }
230 settupleitem(v, i, w);
231 }
232 if (v != NULL && **p_format != endchar) {
233 DECREF(v);
234 v = NULL;
235 err_setstr(SystemError, "Unmatched paren in format");
236 }
237 else if (endchar)
238 ++*p_format;
239 return v;
240}
241
242static object *
Guido van Rossum899dcf31992-05-15 11:04:59 +0000243do_mkvalue(p_format, p_va)
244 char **p_format;
245 va_list *p_va;
246{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000247 for (;;) {
248 switch (*(*p_format)++) {
249 case '(':
250 return do_mktuple(p_format, p_va, ')',
251 countformat(*p_format, ')'));
252
253 case '[':
254 return do_mklist(p_format, p_va, ']',
255 countformat(*p_format, ']'));
256
257 case '{':
258 return do_mkdict(p_format, p_va, '}',
259 countformat(*p_format, '}'));
260
261 case 'b':
262 case 'h':
263 case 'i':
264 return newintobject((long)va_arg(*p_va, int));
265
266 case 'l':
267 return newintobject((long)va_arg(*p_va, long));
268
269 case 'f':
270 case 'd':
271 return newfloatobject((double)va_arg(*p_va, double));
272
273 case 'c':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000274 {
275 char p[1];
276 p[0] = va_arg(*p_va, int);
277 return newsizedstringobject(p, 1);
278 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000279
280 case 's':
281 case 'z':
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000282 {
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000283 object *v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000284 char *str = va_arg(*p_va, char *);
285 int n;
286 if (**p_format == '#') {
287 ++*p_format;
288 n = va_arg(*p_va, int);
289 }
290 else
291 n = -1;
292 if (str == NULL) {
293 v = None;
294 INCREF(v);
295 }
296 else {
297 if (n < 0)
298 n = strlen(str);
299 v = newsizedstringobject(str, n);
300 }
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000301 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000302 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000303
304 case 'S':
305 case 'O':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000306 {
307 object *v;
308 v = va_arg(*p_va, object *);
309 if (v != NULL)
310 INCREF(v);
311 else if (!err_occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000312 /* If a NULL was passed
313 * because a call that should
314 * have constructed a value
315 * failed, that's OK, and we
316 * pass the error on; but if
317 * no error occurred it's not
318 * clear that the caller knew
319 * what she was doing. */
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000320 err_setstr(SystemError,
321 "NULL object passed to mkvalue");
322 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000323 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000324
325 case ':':
326 case ',':
327 case ' ':
328 case '\t':
329 break;
330
331 default:
332 err_setstr(SystemError,
333 "bad format char passed to mkvalue");
334 return NULL;
335
336 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000337 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000338}
339
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000340
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000341#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000342/* VARARGS 2 */
343object *mkvalue(char *format, ...)
344#else
345/* VARARGS */
346object *mkvalue(va_alist) va_dcl
347#endif
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000348{
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000349 va_list va;
350 object* retval;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000351#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000352 va_start(va, format);
353#else
354 char *format;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000355 va_start(va);
356 format = va_arg(va, char *);
357#endif
Guido van Rossume5372401993-03-16 12:15:04 +0000358 retval = vmkvalue(format, va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000359 va_end(va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000360 return retval;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000361}
Guido van Rossume5372401993-03-16 12:15:04 +0000362
363object *
364vmkvalue(format, va)
365 char *format;
366 va_list va;
367{
368 char *f = format;
369 int n = countformat(f, '\0');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000370 va_list lva;
371
372#ifdef VA_LIST_IS_ARRAY
373 memcpy(lva, va, sizeof(va_list));
374#else
375 lva = va;
376#endif
377
Guido van Rossume5372401993-03-16 12:15:04 +0000378 if (n < 0)
379 return NULL;
380 if (n == 0) {
381 INCREF(None);
382 return None;
383 }
384 if (n == 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000385 return do_mkvalue(&f, &lva);
386 return do_mktuple(&f, &lva, '\0', n);
387}
388
389
390#ifdef HAVE_STDARG_PROTOTYPES
391object *
392PyEval_CallFunction(object *obj, char *format, ...)
393#else
394object *
395PyEval_CallFunction(obj, format, va_alist)
396 object *obj;
397 char *format;
398 va_dcl
399#endif
400{
401 va_list vargs;
402 object *args;
403 object *res;
404
405#ifdef HAVE_STDARG_PROTOTYPES
406 va_start(vargs, format);
407#else
408 va_start(vargs);
409#endif
410
411 args = vmkvalue(format, vargs);
412 va_end(vargs);
413
414 if (args == NULL)
415 return NULL;
416
417 res = call_object(obj, args);
418 DECREF(args);
419
420 return res;
421}
422
423
424#ifdef HAVE_STDARG_PROTOTYPES
425object *
426PyEval_CallMethod(object *obj, char *method, char *format, ...)
427#else
428object *
429PyEval_CallMethod(obj, method, format, va_alist)
430 object *obj;
431 char *method;
432 char *format;
433 va_dcl
434#endif
435{
436 va_list vargs;
437 object *meth;
438 object *args;
439 object *res;
440
441 meth = getattr(obj, method);
442 if (meth == NULL)
443 return NULL;
444
445#ifdef HAVE_STDARG_PROTOTYPES
446 va_start(vargs, format);
447#else
448 va_start(vargs);
449#endif
450
451 args = vmkvalue(format, vargs);
452 va_end(vargs);
453
454 if (args == NULL) {
455 DECREF(meth);
456 return NULL;
457 }
458
459 res = call_object(meth, args);
460 DECREF(meth);
461 DECREF(args);
462
463 return res;
Guido van Rossume5372401993-03-16 12:15:04 +0000464}