blob: ae9a838580b6bdb42091c8a8f13bd88251980df0 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum1d5735e1994-08-30 08:27:36 +00002Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
Guido van Rossum34679b71993-01-26 13:33:44 +00003Amsterdam, The 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;
32#else
33typedef double va_double;
34#endif
35
36
37/* initmodule2() has an additional parameter, 'passthrough', which is
38 passed as 'self' to functions defined in the module. This is used
39 e.g. by dynamically loaded modules on the Mac. */
40
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000041object *
Guido van Rossum1d5735e1994-08-30 08:27:36 +000042initmodule2(name, methods, passthrough)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000043 char *name;
44 struct methodlist *methods;
Guido van Rossum1d5735e1994-08-30 08:27:36 +000045 object *passthrough;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000046{
47 object *m, *d, *v;
48 struct methodlist *ml;
Guido van Rossuma2b7f401993-01-04 09:09:59 +000049 char *namebuf;
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 Rossuma2b7f401993-01-04 09:09:59 +000056 namebuf = NEW(char, strlen(name) + strlen(ml->ml_name) + 2);
57 if (namebuf == NULL)
58 fatal("out of mem for method name");
Guido van Rossum3f5da241990-12-20 15:06:42 +000059 sprintf(namebuf, "%s.%s", name, ml->ml_name);
Guido van Rossuma2b7f401993-01-04 09:09:59 +000060 v = newmethodobject(namebuf, ml->ml_meth,
Guido van Rossum1d5735e1994-08-30 08:27:36 +000061 (object *)passthrough, ml->ml_varargs);
Guido van Rossuma2b7f401993-01-04 09:09:59 +000062 /* XXX The malloc'ed memory in namebuf is never freed */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000063 if (v == NULL || dictinsert(d, ml->ml_name, v) != 0) {
64 fprintf(stderr, "initializing module: %s\n", name);
65 fatal("can't initialize module");
66 }
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{
79 return initmodule2(name, methods, (object *)NULL);
80}
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) {
93 if (*format == '\0') {
94 /* Premature end */
95 err_setstr(SystemError, "unmatched paren in format");
96 return -1;
97 }
98 else if (*format == '(') {
99 if (level == 0)
100 count++;
101 level++;
102 }
103 else if (*format == ')')
104 level--;
105 else if (level == 0 && *format != '#')
106 count++;
107 format++;
108 }
109 return count;
110}
111
112
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000113/* Generic function to create a value -- the inverse of getargs() */
114/* After an original idea and first implementation by Steven Miale */
115
116static object *do_mktuple PROTO((char**, va_list *, int, int));
117static object *do_mkvalue PROTO((char**, va_list *));
118
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000119static object *
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000120do_mktuple(p_format, p_va, endchar, n)
121 char **p_format;
122 va_list *p_va;
123 int endchar;
124 int n;
125{
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000126 object *v;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000127 int i;
128 if (n < 0)
129 return NULL;
130 if ((v = newtupleobject(n)) == NULL)
131 return NULL;
132 for (i = 0; i < n; i++) {
133 object *w = do_mkvalue(p_format, p_va);
134 if (w == NULL) {
135 DECREF(v);
136 return NULL;
137 }
138 settupleitem(v, i, w);
139 }
140 if (v != NULL && **p_format != endchar) {
141 DECREF(v);
142 v = NULL;
143 err_setstr(SystemError, "Unmatched paren in format");
144 }
145 else if (endchar)
146 ++*p_format;
147 return v;
148}
149
150static object *
Guido van Rossum899dcf31992-05-15 11:04:59 +0000151do_mkvalue(p_format, p_va)
152 char **p_format;
153 va_list *p_va;
154{
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000155
156 switch (*(*p_format)++) {
157
158 case '(':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000159 return do_mktuple(p_format, p_va, ')',
160 countformat(*p_format, ')'));
Guido van Rossume5372401993-03-16 12:15:04 +0000161
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000162 case 'b':
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000163 case 'h':
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000164 case 'i':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000165 return newintobject((long)va_arg(*p_va, int));
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000166
167 case 'l':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000168 return newintobject((long)va_arg(*p_va, long));
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000169
170 case 'f':
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000171 case 'd':
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000172 return newfloatobject((double)va_arg(*p_va, va_double));
Guido van Rossume5372401993-03-16 12:15:04 +0000173
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000174 case 'c':
175 {
176 char p[1];
177 p[0] = va_arg(*p_va, int);
178 return newsizedstringobject(p, 1);
179 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000180
181 case 's':
182 case 'z':
183 {
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000184 object *v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000185 char *str = va_arg(*p_va, char *);
186 int n;
187 if (**p_format == '#') {
188 ++*p_format;
189 n = va_arg(*p_va, int);
190 }
191 else
192 n = -1;
193 if (str == NULL) {
194 v = None;
195 INCREF(v);
196 }
197 else {
198 if (n < 0)
199 n = strlen(str);
200 v = newsizedstringobject(str, n);
201 }
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000202 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000203 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000204
205 case 'S':
206 case 'O':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000207 {
208 object *v;
209 v = va_arg(*p_va, object *);
210 if (v != NULL)
211 INCREF(v);
212 else if (!err_occurred())
213 /* If a NULL was passed because a call
214 that should have constructed a value
215 failed, that's OK, and we pass the error
216 on; but if no error occurred it's not
217 clear that the caller knew what she
218 was doing. */
219 err_setstr(SystemError,
220 "NULL object passed to mkvalue");
221 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000222 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000223
224 default:
225 err_setstr(SystemError, "bad format char passed to mkvalue");
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000226 return NULL;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000227
228 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000229}
230
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000231#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000232/* VARARGS 2 */
233object *mkvalue(char *format, ...)
234#else
235/* VARARGS */
236object *mkvalue(va_alist) va_dcl
237#endif
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000238{
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000239 va_list va;
240 object* retval;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000241#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000242 va_start(va, format);
243#else
244 char *format;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000245 va_start(va);
246 format = va_arg(va, char *);
247#endif
Guido van Rossume5372401993-03-16 12:15:04 +0000248 retval = vmkvalue(format, va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000249 va_end(va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000250 return retval;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000251}
Guido van Rossume5372401993-03-16 12:15:04 +0000252
253object *
254vmkvalue(format, va)
255 char *format;
256 va_list va;
257{
258 char *f = format;
259 int n = countformat(f, '\0');
260 if (n < 0)
261 return NULL;
262 if (n == 0) {
263 INCREF(None);
264 return None;
265 }
266 if (n == 1)
267 return do_mkvalue(&f, &va);
268 return do_mktuple(&f, &va, '\0', n);
269}