blob: 826e2858748c9c5dd412735b651165f93f2fed93 [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 "modsupport.h"
29#include "import.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000030
Guido van Rossum1d5735e1994-08-30 08:27:36 +000031#ifdef MPW /* MPW pushes 'extended' for float and double types with varargs */
32typedef extended va_double;
33#else
34typedef double va_double;
35#endif
36
37
38/* initmodule2() has an additional parameter, 'passthrough', which is
39 passed as 'self' to functions defined in the module. This is used
40 e.g. by dynamically loaded modules on the Mac. */
41
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000042object *
Guido van Rossum1d5735e1994-08-30 08:27:36 +000043initmodule2(name, methods, passthrough)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000044 char *name;
45 struct methodlist *methods;
Guido van Rossum1d5735e1994-08-30 08:27:36 +000046 object *passthrough;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000047{
48 object *m, *d, *v;
49 struct methodlist *ml;
Guido van Rossuma2b7f401993-01-04 09:09:59 +000050 char *namebuf;
Guido van Rossum3f5da241990-12-20 15:06:42 +000051 if ((m = add_module(name)) == NULL) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000052 fprintf(stderr, "initializing module: %s\n", name);
53 fatal("can't create a module");
54 }
55 d = getmoduledict(m);
56 for (ml = methods; ml->ml_name != NULL; ml++) {
Guido van Rossuma2b7f401993-01-04 09:09:59 +000057 namebuf = NEW(char, strlen(name) + strlen(ml->ml_name) + 2);
58 if (namebuf == NULL)
59 fatal("out of mem for method name");
Guido van Rossum3f5da241990-12-20 15:06:42 +000060 sprintf(namebuf, "%s.%s", name, ml->ml_name);
Guido van Rossuma2b7f401993-01-04 09:09:59 +000061 v = newmethodobject(namebuf, ml->ml_meth,
Guido van Rossum1d5735e1994-08-30 08:27:36 +000062 (object *)passthrough, ml->ml_varargs);
Guido van Rossuma2b7f401993-01-04 09:09:59 +000063 /* XXX The malloc'ed memory in namebuf is never freed */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000064 if (v == NULL || dictinsert(d, ml->ml_name, v) != 0) {
65 fprintf(stderr, "initializing module: %s\n", name);
66 fatal("can't initialize module");
67 }
68 DECREF(v);
69 }
Guido van Rossum3f5da241990-12-20 15:06:42 +000070 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000071}
72
Guido van Rossum1d5735e1994-08-30 08:27:36 +000073/* The standard initmodule() passes NULL for 'self' */
74
75object *
76initmodule(name, methods)
77 char *name;
78 struct methodlist *methods;
79{
80 return initmodule2(name, methods, (object *)NULL);
81}
82
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000083
Guido van Rossumbf80e541993-02-08 15:49:17 +000084/* Helper for mkvalue() to scan the length of a format */
Guido van Rossumfc61adb1992-04-13 15:53:41 +000085
86static int countformat PROTO((char *format, int endchar));
87static int countformat(format, endchar)
88 char *format;
89 int endchar;
90{
91 int count = 0;
92 int level = 0;
93 while (level > 0 || *format != endchar) {
94 if (*format == '\0') {
95 /* Premature end */
96 err_setstr(SystemError, "unmatched paren in format");
97 return -1;
98 }
99 else if (*format == '(') {
100 if (level == 0)
101 count++;
102 level++;
103 }
104 else if (*format == ')')
105 level--;
106 else if (level == 0 && *format != '#')
107 count++;
108 format++;
109 }
110 return count;
111}
112
113
Guido van Rossum922cfad1992-01-27 16:47:03 +0000114/* Generic argument list parser */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000115
Guido van Rossum922cfad1992-01-27 16:47:03 +0000116static int do_arg PROTO((object *arg, char** p_format, va_list *p_va));
117static int
118do_arg(arg, p_format, p_va)
119 object *arg;
120 char** p_format;
121 va_list *p_va;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000122{
Guido van Rossum922cfad1992-01-27 16:47:03 +0000123 char *format = *p_format;
Guido van Rossum922cfad1992-01-27 16:47:03 +0000124
125 if (arg == NULL)
126 return 0; /* Incomplete tuple or list */
127
128 switch (*format++) {
129
Guido van Rossuma93265a1992-08-27 07:45:12 +0000130 case '(': /* tuple, distributed over C parameters */ {
Guido van Rossum922cfad1992-01-27 16:47:03 +0000131 int i, n;
132 if (!is_tupleobject(arg))
133 return 0;
134 n = gettuplesize(arg);
135 for (i = 0; i < n; i++) {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000136 if (!do_arg(gettupleitem(arg, i), &format, p_va))
Guido van Rossum922cfad1992-01-27 16:47:03 +0000137 return 0;
138 }
Guido van Rossuma93265a1992-08-27 07:45:12 +0000139 if (*format++ != ')')
Guido van Rossum922cfad1992-01-27 16:47:03 +0000140 return 0;
141 break;
142 }
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000143
Guido van Rossuma93265a1992-08-27 07:45:12 +0000144 case ')': /* End of format -- too many arguments */
145 return 0;
146
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000147 case 'b': /* byte -- very short int */ {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000148 char *p = va_arg(*p_va, char *);
149 long ival = getintvalue(arg);
150 if (ival == -1 && err_occurred())
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000151 return 0;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000152 else
153 *p = ival;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000154 break;
155 }
156
Guido van Rossum922cfad1992-01-27 16:47:03 +0000157 case 'h': /* short int */ {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000158 short *p = va_arg(*p_va, short *);
159 long ival = getintvalue(arg);
160 if (ival == -1 && err_occurred())
Guido van Rossum922cfad1992-01-27 16:47:03 +0000161 return 0;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000162 else
163 *p = ival;
Guido van Rossum922cfad1992-01-27 16:47:03 +0000164 break;
165 }
166
167 case 'i': /* int */ {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000168 int *p = va_arg(*p_va, int *);
169 long ival = getintvalue(arg);
170 if (ival == -1 && err_occurred())
Guido van Rossum922cfad1992-01-27 16:47:03 +0000171 return 0;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000172 else
173 *p = ival;
Guido van Rossum922cfad1992-01-27 16:47:03 +0000174 break;
175 }
176
177 case 'l': /* long int */ {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000178 long *p = va_arg(*p_va, long *);
179 long ival = getintvalue(arg);
180 if (ival == -1 && err_occurred())
Guido van Rossum922cfad1992-01-27 16:47:03 +0000181 return 0;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000182 else
183 *p = ival;
Guido van Rossum922cfad1992-01-27 16:47:03 +0000184 break;
185 }
186
187 case 'f': /* float */ {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000188 float *p = va_arg(*p_va, float *);
189 double dval = getfloatvalue(arg);
190 if (err_occurred())
Guido van Rossum922cfad1992-01-27 16:47:03 +0000191 return 0;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000192 else
193 *p = dval;
Guido van Rossum922cfad1992-01-27 16:47:03 +0000194 break;
195 }
196
197 case 'd': /* double */ {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000198 double *p = va_arg(*p_va, double *);
199 double dval = getfloatvalue(arg);
200 if (err_occurred())
Guido van Rossum922cfad1992-01-27 16:47:03 +0000201 return 0;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000202 else
203 *p = dval;
Guido van Rossum922cfad1992-01-27 16:47:03 +0000204 break;
205 }
206
207 case 'c': /* char */ {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000208 char *p = va_arg(*p_va, char *);
Guido van Rossum922cfad1992-01-27 16:47:03 +0000209 if (is_stringobject(arg) && getstringsize(arg) == 1)
210 *p = getstringvalue(arg)[0];
211 else
212 return 0;
213 break;
214 }
215
216 case 's': /* string */ {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000217 char **p = va_arg(*p_va, char **);
Guido van Rossum922cfad1992-01-27 16:47:03 +0000218 if (is_stringobject(arg))
219 *p = getstringvalue(arg);
220 else
221 return 0;
222 if (*format == '#') {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000223 int *q = va_arg(*p_va, int *);
Guido van Rossum922cfad1992-01-27 16:47:03 +0000224 *q = getstringsize(arg);
225 format++;
226 }
Guido van Rossum96caaee1992-08-14 15:12:03 +0000227 else if (strlen(*p) != getstringsize(arg)) {
228 err_setstr(ValueError, "embedded '\\0' in string arg");
229 return 0;
230 }
Guido van Rossum922cfad1992-01-27 16:47:03 +0000231 break;
232 }
233
234 case 'z': /* string, may be NULL (None) */ {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000235 char **p = va_arg(*p_va, char **);
Guido van Rossum922cfad1992-01-27 16:47:03 +0000236 if (arg == None)
237 *p = 0;
238 else if (is_stringobject(arg))
239 *p = getstringvalue(arg);
240 else
241 return 0;
242 if (*format == '#') {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000243 int *q = va_arg(*p_va, int *);
Guido van Rossum922cfad1992-01-27 16:47:03 +0000244 if (arg == None)
245 *q = 0;
246 else
247 *q = getstringsize(arg);
248 format++;
249 }
Guido van Rossum96caaee1992-08-14 15:12:03 +0000250 else if (*p != NULL && strlen(*p) != getstringsize(arg)) {
251 err_setstr(ValueError, "embedded '\\0' in string arg");
252 return 0;
253 }
Guido van Rossum922cfad1992-01-27 16:47:03 +0000254 break;
255 }
256
257 case 'S': /* string object */ {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000258 object **p = va_arg(*p_va, object **);
Guido van Rossum922cfad1992-01-27 16:47:03 +0000259 if (is_stringobject(arg))
260 *p = arg;
261 else
262 return 0;
263 break;
264 }
265
266 case 'O': /* object */ {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000267 typeobject *type;
268 object **p;
269 if (*format == '!') {
270 format++;
271 type = va_arg(*p_va, typeobject*);
272 if (arg->ob_type != type)
273 return 0;
274 else {
275 p = va_arg(*p_va, object **);
276 *p = arg;
277 }
278 }
279 else if (*format == '?') {
280 inquiry pred = va_arg(*p_va, inquiry);
281 format++;
282 if ((*pred)(arg)) {
283 p = va_arg(*p_va, object **);
284 *p = arg;
285 }
286 }
287 else if (*format == '&') {
288 binaryfunc convert = va_arg(*p_va, binaryfunc);
289 void *addr = va_arg(*p_va, void *);
290 format++;
291 if (! (*convert)(arg, addr))
292 return 0;
293 }
294 else {
295 p = va_arg(*p_va, object **);
296 *p = arg;
297 }
Guido van Rossum922cfad1992-01-27 16:47:03 +0000298 break;
299 }
300
301 default:
302 fprintf(stderr, "bad do_arg format: x%x '%c'\n",
303 format[-1], format[-1]);
304 return 0;
305
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000306 }
Guido van Rossum922cfad1992-01-27 16:47:03 +0000307
Guido van Rossum922cfad1992-01-27 16:47:03 +0000308 *p_format = format;
309
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000310 return 1;
311}
312
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000313#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossum292bb8e1992-03-27 17:23:29 +0000314/* VARARGS2 */
Guido van Rossum922cfad1992-01-27 16:47:03 +0000315int getargs(object *arg, char *format, ...)
316#else
Guido van Rossum292bb8e1992-03-27 17:23:29 +0000317/* VARARGS */
Guido van Rossum922cfad1992-01-27 16:47:03 +0000318int getargs(va_alist) va_dcl
319#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000320{
Guido van Rossum922cfad1992-01-27 16:47:03 +0000321 char *f;
322 int ok;
323 va_list va;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000324#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000325
Guido van Rossum922cfad1992-01-27 16:47:03 +0000326 va_start(va, format);
327#else
328 object *arg;
329 char *format;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000330
Guido van Rossum922cfad1992-01-27 16:47:03 +0000331 va_start(va);
332 arg = va_arg(va, object *);
333 format = va_arg(va, char *);
334#endif
Guido van Rossumbf80e541993-02-08 15:49:17 +0000335 if (*format == '\0' || *format == ';') {
Guido van Rossum922cfad1992-01-27 16:47:03 +0000336 va_end(va);
337 if (arg != NULL) {
Guido van Rossumbf80e541993-02-08 15:49:17 +0000338 char *str = "no arguments needed";
339 if (*format == ';')
340 str = format+1;
341 err_setstr(TypeError, str);
Guido van Rossum922cfad1992-01-27 16:47:03 +0000342 return 0;
343 }
Guido van Rossumc5da3501991-09-10 14:56:32 +0000344 return 1;
345 }
Guido van Rossum922cfad1992-01-27 16:47:03 +0000346
347 f = format;
Guido van Rossumbf80e541993-02-08 15:49:17 +0000348 ok = do_arg(arg, &f, &va) && (*f == '\0' || *f == ';');
Guido van Rossum922cfad1992-01-27 16:47:03 +0000349 va_end(va);
350 if (!ok) {
Guido van Rossum96caaee1992-08-14 15:12:03 +0000351 if (!err_occurred()) {
Guido van Rossumbf80e541993-02-08 15:49:17 +0000352 char buf[256];
353 char *str;
354 f = strchr(format, ';');
355 if (f != NULL)
356 str = f+1;
357 else {
358 sprintf(buf, "bad argument list (format '%s')",
359 format);
360 str = buf;
361 }
362 err_setstr(TypeError, str);
Guido van Rossum96caaee1992-08-14 15:12:03 +0000363 }
Guido van Rossumc5da3501991-09-10 14:56:32 +0000364 }
Guido van Rossum922cfad1992-01-27 16:47:03 +0000365 return ok;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000366}
367
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000368#ifdef UNUSED
369
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000370int
371getlongtuplearg(args, a, n)
372 object *args;
373 long *a; /* [n] */
374 int n;
375{
376 int i;
377 if (!is_tupleobject(args) || gettuplesize(args) != n) {
378 return err_badarg();
379 }
380 for (i = 0; i < n; i++) {
381 object *v = gettupleitem(args, i);
382 if (!is_intobject(v)) {
383 return err_badarg();
384 }
385 a[i] = getintvalue(v);
386 }
387 return 1;
388}
389
390int
391getshorttuplearg(args, a, n)
392 object *args;
393 short *a; /* [n] */
394 int n;
395{
396 int i;
397 if (!is_tupleobject(args) || gettuplesize(args) != n) {
398 return err_badarg();
399 }
400 for (i = 0; i < n; i++) {
401 object *v = gettupleitem(args, i);
402 if (!is_intobject(v)) {
403 return err_badarg();
404 }
405 a[i] = getintvalue(v);
406 }
407 return 1;
408}
409
410int
411getlonglistarg(args, a, n)
412 object *args;
413 long *a; /* [n] */
414 int n;
415{
416 int i;
417 if (!is_listobject(args) || getlistsize(args) != n) {
418 return err_badarg();
419 }
420 for (i = 0; i < n; i++) {
421 object *v = getlistitem(args, i);
422 if (!is_intobject(v)) {
423 return err_badarg();
424 }
425 a[i] = getintvalue(v);
426 }
427 return 1;
428}
429
430int
431getshortlistarg(args, a, n)
432 object *args;
433 short *a; /* [n] */
434 int n;
435{
436 int i;
437 if (!is_listobject(args) || getlistsize(args) != n) {
438 return err_badarg();
439 }
440 for (i = 0; i < n; i++) {
441 object *v = getlistitem(args, i);
442 if (!is_intobject(v)) {
443 return err_badarg();
444 }
445 a[i] = getintvalue(v);
446 }
447 return 1;
448}
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000449
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000450#endif /* UNUSED */
451
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000452
453/* Generic function to create a value -- the inverse of getargs() */
454/* After an original idea and first implementation by Steven Miale */
455
456static object *do_mktuple PROTO((char**, va_list *, int, int));
457static object *do_mkvalue PROTO((char**, va_list *));
458
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000459static object *
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000460do_mktuple(p_format, p_va, endchar, n)
461 char **p_format;
462 va_list *p_va;
463 int endchar;
464 int n;
465{
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000466 object *v;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000467 int i;
468 if (n < 0)
469 return NULL;
470 if ((v = newtupleobject(n)) == NULL)
471 return NULL;
472 for (i = 0; i < n; i++) {
473 object *w = do_mkvalue(p_format, p_va);
474 if (w == NULL) {
475 DECREF(v);
476 return NULL;
477 }
478 settupleitem(v, i, w);
479 }
480 if (v != NULL && **p_format != endchar) {
481 DECREF(v);
482 v = NULL;
483 err_setstr(SystemError, "Unmatched paren in format");
484 }
485 else if (endchar)
486 ++*p_format;
487 return v;
488}
489
490static object *
Guido van Rossum899dcf31992-05-15 11:04:59 +0000491do_mkvalue(p_format, p_va)
492 char **p_format;
493 va_list *p_va;
494{
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000495
496 switch (*(*p_format)++) {
497
498 case '(':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000499 return do_mktuple(p_format, p_va, ')',
500 countformat(*p_format, ')'));
Guido van Rossume5372401993-03-16 12:15:04 +0000501
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000502 case 'b':
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000503 case 'h':
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000504 case 'i':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000505 return newintobject((long)va_arg(*p_va, int));
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000506
507 case 'l':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000508 return newintobject((long)va_arg(*p_va, long));
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000509
510 case 'f':
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000511 case 'd':
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000512 return newfloatobject((double)va_arg(*p_va, va_double));
Guido van Rossume5372401993-03-16 12:15:04 +0000513
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000514 case 'c':
515 {
516 char p[1];
517 p[0] = va_arg(*p_va, int);
518 return newsizedstringobject(p, 1);
519 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000520
521 case 's':
522 case 'z':
523 {
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000524 object *v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000525 char *str = va_arg(*p_va, char *);
526 int n;
527 if (**p_format == '#') {
528 ++*p_format;
529 n = va_arg(*p_va, int);
530 }
531 else
532 n = -1;
533 if (str == NULL) {
534 v = None;
535 INCREF(v);
536 }
537 else {
538 if (n < 0)
539 n = strlen(str);
540 v = newsizedstringobject(str, n);
541 }
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000542 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000543 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000544
545 case 'S':
546 case 'O':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000547 {
548 object *v;
549 v = va_arg(*p_va, object *);
550 if (v != NULL)
551 INCREF(v);
552 else if (!err_occurred())
553 /* If a NULL was passed because a call
554 that should have constructed a value
555 failed, that's OK, and we pass the error
556 on; but if no error occurred it's not
557 clear that the caller knew what she
558 was doing. */
559 err_setstr(SystemError,
560 "NULL object passed to mkvalue");
561 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000562 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000563
564 default:
565 err_setstr(SystemError, "bad format char passed to mkvalue");
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000566 return NULL;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000567
568 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000569}
570
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000571#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000572/* VARARGS 2 */
573object *mkvalue(char *format, ...)
574#else
575/* VARARGS */
576object *mkvalue(va_alist) va_dcl
577#endif
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000578{
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000579 va_list va;
580 object* retval;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000581#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000582 va_start(va, format);
583#else
584 char *format;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000585 va_start(va);
586 format = va_arg(va, char *);
587#endif
Guido van Rossume5372401993-03-16 12:15:04 +0000588 retval = vmkvalue(format, va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000589 va_end(va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000590 return retval;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000591}
Guido van Rossume5372401993-03-16 12:15:04 +0000592
593object *
594vmkvalue(format, va)
595 char *format;
596 va_list va;
597{
598 char *f = format;
599 int n = countformat(f, '\0');
600 if (n < 0)
601 return NULL;
602 if (n == 0) {
603 INCREF(None);
604 return None;
605 }
606 if (n == 1)
607 return do_mkvalue(&f, &va);
608 return do_mktuple(&f, &va, '\0', n);
609}