Mercurial > cpython-lru_cache-weakref
annotate Python/modsupport.c @ 816:e4a27d84ea36 legacy-trunk
Added mkvalue() function
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Mon, 13 Apr 1992 10:48:55 +0000 |
| parents | 0cd197947d81 |
| children | aa633f0defa6 |
| rev | line source |
|---|---|
| 145 | 1 /*********************************************************** |
|
795
0cd197947d81
Copyright for 1992 added
Guido van Rossum <guido@python.org>
parents:
733
diff
changeset
|
2 Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The |
| 145 | 3 Netherlands. |
| 4 | |
| 5 All Rights Reserved | |
| 6 | |
| 7 Permission to use, copy, modify, and distribute this software and its | |
| 8 documentation for any purpose and without fee is hereby granted, | |
| 9 provided that the above copyright notice appear in all copies and that | |
| 10 both that copyright notice and this permission notice appear in | |
| 11 supporting documentation, and that the names of Stichting Mathematisch | |
| 12 Centrum or CWI not be used in advertising or publicity pertaining to | |
| 13 distribution of the software without specific, written prior permission. | |
| 14 | |
| 15 STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO | |
| 16 THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND | |
| 17 FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE | |
| 18 FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
| 19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
| 20 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | |
| 21 OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
| 22 | |
| 23 ******************************************************************/ | |
| 24 | |
| 6 | 25 /* Module support implementation */ |
| 26 | |
| 86 | 27 #include "allobjects.h" |
| 6 | 28 #include "modsupport.h" |
| 29 #include "import.h" | |
| 30 | |
|
637
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
31 #ifdef HAVE_PROTOTYPES |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
32 #define USE_STDARG |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
33 #endif |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
34 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
35 #ifdef USE_STDARG |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
36 #include <stdarg.h> |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
37 #else |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
38 #include <varargs.h> |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
39 #endif |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
40 |
| 6 | 41 |
| 42 object * | |
| 43 initmodule(name, methods) | |
| 44 char *name; | |
| 45 struct methodlist *methods; | |
| 46 { | |
| 47 object *m, *d, *v; | |
| 48 struct methodlist *ml; | |
| 86 | 49 char namebuf[256]; |
| 50 if ((m = add_module(name)) == NULL) { | |
| 6 | 51 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++) { | |
| 86 | 56 sprintf(namebuf, "%s.%s", name, ml->ml_name); |
| 57 v = newmethodobject(strdup(namebuf), ml->ml_meth, | |
|
488
90f35fcf8ea0
Add "varargs" attribute.
Guido van Rossum <guido@python.org>
parents:
372
diff
changeset
|
58 (object *)NULL, ml->ml_varargs); |
| 86 | 59 /* XXX The strdup'ed memory is never freed */ |
| 6 | 60 if (v == NULL || dictinsert(d, ml->ml_name, v) != 0) { |
| 61 fprintf(stderr, "initializing module: %s\n", name); | |
| 62 fatal("can't initialize module"); | |
| 63 } | |
| 64 DECREF(v); | |
| 65 } | |
| 86 | 66 return m; |
| 6 | 67 } |
| 68 | |
| 69 | |
|
637
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
70 /* Generic argument list parser */ |
| 6 | 71 |
|
637
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
72 static int do_arg PROTO((object *arg, char** p_format, va_list *p_va)); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
73 static int |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
74 do_arg(arg, p_format, p_va) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
75 object *arg; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
76 char** p_format; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
77 va_list *p_va; |
| 6 | 78 { |
|
637
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
79 char *format = *p_format; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
80 va_list va = *p_va; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
81 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
82 if (arg == NULL) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
83 return 0; /* Incomplete tuple or list */ |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
84 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
85 switch (*format++) { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
86 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
87 case '('/*')'*/: /* tuple, distributed over C parameters */ { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
88 int i, n; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
89 if (!is_tupleobject(arg)) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
90 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
91 n = gettuplesize(arg); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
92 for (i = 0; i < n; i++) { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
93 if (!do_arg(gettupleitem(arg, i), &format, &va)) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
94 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
95 } |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
96 if (*format++ != /*'('*/')') |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
97 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
98 break; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
99 } |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
100 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
101 case 'h': /* short int */ { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
102 short *p = va_arg(va, short *); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
103 if (is_intobject(arg)) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
104 *p = getintvalue(arg); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
105 else |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
106 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
107 break; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
108 } |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
109 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
110 case 'i': /* int */ { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
111 int *p = va_arg(va, int *); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
112 if (is_intobject(arg)) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
113 *p = getintvalue(arg); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
114 else |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
115 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
116 break; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
117 } |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
118 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
119 case 'l': /* long int */ { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
120 long *p = va_arg(va, long *); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
121 if (is_intobject(arg)) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
122 *p = getintvalue(arg); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
123 else |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
124 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
125 break; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
126 } |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
127 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
128 case 'f': /* float */ { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
129 float *p = va_arg(va, float *); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
130 if (is_floatobject(arg)) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
131 *p = getfloatvalue(arg); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
132 else if (is_intobject(arg)) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
133 *p = (float)getintvalue(arg); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
134 else |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
135 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
136 break; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
137 } |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
138 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
139 case 'd': /* double */ { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
140 double *p = va_arg(va, double *); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
141 if (is_floatobject(arg)) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
142 *p = getfloatvalue(arg); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
143 else if (is_intobject(arg)) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
144 *p = (double)getintvalue(arg); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
145 else |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
146 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
147 break; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
148 } |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
149 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
150 case 'c': /* char */ { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
151 char *p = va_arg(va, char *); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
152 if (is_stringobject(arg) && getstringsize(arg) == 1) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
153 *p = getstringvalue(arg)[0]; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
154 else |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
155 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
156 break; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
157 } |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
158 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
159 case 's': /* string */ { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
160 char **p = va_arg(va, char **); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
161 if (is_stringobject(arg)) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
162 *p = getstringvalue(arg); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
163 else |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
164 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
165 if (*format == '#') { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
166 int *q = va_arg(va, int *); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
167 *q = getstringsize(arg); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
168 format++; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
169 } |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
170 break; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
171 } |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
172 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
173 case 'z': /* string, may be NULL (None) */ { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
174 char **p = va_arg(va, char **); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
175 if (arg == None) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
176 *p = 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
177 else if (is_stringobject(arg)) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
178 *p = getstringvalue(arg); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
179 else |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
180 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
181 if (*format == '#') { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
182 int *q = va_arg(va, int *); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
183 if (arg == None) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
184 *q = 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
185 else |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
186 *q = getstringsize(arg); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
187 format++; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
188 } |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
189 break; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
190 } |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
191 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
192 case 'S': /* string object */ { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
193 object **p = va_arg(va, object **); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
194 if (is_stringobject(arg)) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
195 *p = arg; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
196 else |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
197 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
198 break; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
199 } |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
200 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
201 case 'O': /* object */ { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
202 object **p = va_arg(va, object **); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
203 *p = arg; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
204 break; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
205 } |
| 6 | 206 |
|
637
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
207 default: |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
208 fprintf(stderr, "bad do_arg format: x%x '%c'\n", |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
209 format[-1], format[-1]); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
210 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
211 |
| 6 | 212 } |
|
637
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
213 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
214 *p_va = va; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
215 *p_format = format; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
216 |
| 6 | 217 return 1; |
| 218 } | |
| 219 | |
|
637
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
220 #ifdef USE_STDARG |
| 733 | 221 /* VARARGS2 */ |
|
637
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
222 int getargs(object *arg, char *format, ...) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
223 #else |
| 733 | 224 /* VARARGS */ |
|
637
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
225 int getargs(va_alist) va_dcl |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
226 #endif |
| 6 | 227 { |
|
637
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
228 char *f; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
229 int ok; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
230 va_list va; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
231 #ifdef USE_STDARG |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
232 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
233 va_start(va, format); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
234 #else |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
235 object *arg; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
236 char *format; |
| 6 | 237 |
|
637
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
238 va_start(va); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
239 arg = va_arg(va, object *); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
240 format = va_arg(va, char *); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
241 #endif |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
242 if (*format == '\0') { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
243 va_end(va); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
244 if (arg != NULL) { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
245 err_setstr(TypeError, "no arguments needed"); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
246 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
247 } |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
248 return 1; |
| 6 | 249 } |
|
637
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
250 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
251 f = format; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
252 ok = do_arg(arg, &f, &va) && *f == '\0'; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
253 va_end(va); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
254 if (!ok) { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
255 char buf[256]; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
256 sprintf(buf, "bad argument list (format '%s')", format); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
257 err_setstr(TypeError, buf); |
| 6 | 258 } |
|
637
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
259 return ok; |
| 6 | 260 } |
| 261 | |
| 262 int | |
| 263 getlongtuplearg(args, a, n) | |
| 264 object *args; | |
| 265 long *a; /* [n] */ | |
| 266 int n; | |
| 267 { | |
| 268 int i; | |
| 269 if (!is_tupleobject(args) || gettuplesize(args) != n) { | |
| 270 return err_badarg(); | |
| 271 } | |
| 272 for (i = 0; i < n; i++) { | |
| 273 object *v = gettupleitem(args, i); | |
| 274 if (!is_intobject(v)) { | |
| 275 return err_badarg(); | |
| 276 } | |
| 277 a[i] = getintvalue(v); | |
| 278 } | |
| 279 return 1; | |
| 280 } | |
| 281 | |
| 282 int | |
| 283 getshorttuplearg(args, a, n) | |
| 284 object *args; | |
| 285 short *a; /* [n] */ | |
| 286 int n; | |
| 287 { | |
| 288 int i; | |
| 289 if (!is_tupleobject(args) || gettuplesize(args) != n) { | |
| 290 return err_badarg(); | |
| 291 } | |
| 292 for (i = 0; i < n; i++) { | |
| 293 object *v = gettupleitem(args, i); | |
| 294 if (!is_intobject(v)) { | |
| 295 return err_badarg(); | |
| 296 } | |
| 297 a[i] = getintvalue(v); | |
| 298 } | |
| 299 return 1; | |
| 300 } | |
| 301 | |
| 302 int | |
| 303 getlonglistarg(args, a, n) | |
| 304 object *args; | |
| 305 long *a; /* [n] */ | |
| 306 int n; | |
| 307 { | |
| 308 int i; | |
| 309 if (!is_listobject(args) || getlistsize(args) != n) { | |
| 310 return err_badarg(); | |
| 311 } | |
| 312 for (i = 0; i < n; i++) { | |
| 313 object *v = getlistitem(args, i); | |
| 314 if (!is_intobject(v)) { | |
| 315 return err_badarg(); | |
| 316 } | |
| 317 a[i] = getintvalue(v); | |
| 318 } | |
| 319 return 1; | |
| 320 } | |
| 321 | |
| 322 int | |
| 323 getshortlistarg(args, a, n) | |
| 324 object *args; | |
| 325 short *a; /* [n] */ | |
| 326 int n; | |
| 327 { | |
| 328 int i; | |
| 329 if (!is_listobject(args) || getlistsize(args) != n) { | |
| 330 return err_badarg(); | |
| 331 } | |
| 332 for (i = 0; i < n; i++) { | |
| 333 object *v = getlistitem(args, i); | |
| 334 if (!is_intobject(v)) { | |
| 335 return err_badarg(); | |
| 336 } | |
| 337 a[i] = getintvalue(v); | |
| 338 } | |
| 339 return 1; | |
| 340 } | |
|
816
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
341 |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
342 static object * |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
343 do_mkval(char **p_format, va_list *p_va) { |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
344 object *v; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
345 |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
346 switch (*(*p_format)++) { |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
347 |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
348 case '(': |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
349 { |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
350 int n = 0; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
351 char *p = *p_format; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
352 int level = 0; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
353 int i; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
354 while (level > 0 || *p != ')') { |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
355 if (*p == '\0') { |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
356 err_setstr(SystemError, "missing ')' in mkvalue format"); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
357 return NULL; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
358 } |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
359 else if (*p == '(') { |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
360 if (level == 0) |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
361 n++; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
362 level++; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
363 } |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
364 else if (*p == ')') |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
365 level--; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
366 else if (level == 0 && *p != '#') |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
367 n++; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
368 p++; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
369 } |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
370 v = newtupleobject(n); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
371 if (v == NULL) |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
372 break; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
373 for (i = 0; i < n; i++) { |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
374 object *w = do_mkval(p_format, p_va); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
375 if (w == NULL) { |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
376 DECREF(v); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
377 v = NULL; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
378 break; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
379 } |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
380 settupleitem(v, i, w); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
381 } |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
382 if (v != NULL && *(*p_format)++ != ')') { |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
383 /* "Cannot happen" */ |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
384 err_setstr(SystemError, "inconsistent format in mkvalue???"); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
385 DECREF(v); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
386 v = NULL; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
387 } |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
388 } |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
389 break; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
390 |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
391 case 'h': |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
392 v = newintobject((long)va_arg(*p_va, short)); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
393 break; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
394 |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
395 case 'i': |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
396 v = newintobject((long)va_arg(*p_va, int)); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
397 break; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
398 |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
399 case 'l': |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
400 v = newintobject((long)va_arg(*p_va, long)); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
401 break; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
402 |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
403 case 'f': |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
404 v = newfloatobject((double)va_arg(*p_va, float)); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
405 break; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
406 |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
407 case 'd': |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
408 v = newfloatobject((double)va_arg(*p_va, double)); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
409 break; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
410 |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
411 case 's': |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
412 case 'z': |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
413 { |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
414 char *str = va_arg(*p_va, char *); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
415 int n; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
416 if (**p_format == '#') { |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
417 ++*p_format; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
418 n = va_arg(*p_va, int); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
419 } |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
420 else |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
421 n = -1; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
422 if (str == NULL) { |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
423 v = None; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
424 INCREF(v); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
425 } |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
426 else { |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
427 if (n < 0) |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
428 n = strlen(str); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
429 v = newsizedstringobject(str, n); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
430 } |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
431 } |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
432 break; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
433 |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
434 case 'S': |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
435 case 'O': |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
436 v = va_arg(*p_va, object *); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
437 if (v == NULL) { |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
438 if (!err_occurred()) |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
439 err_setstr(SystemError, "NULL object passed to mkvalue"); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
440 } |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
441 else |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
442 INCREF(v); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
443 break; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
444 |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
445 default: |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
446 err_setstr(SystemError, "bad format char passed to mkvalue"); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
447 v = NULL; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
448 break; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
449 |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
450 } |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
451 |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
452 return v; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
453 } |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
454 |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
455 object * |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
456 mkvalue(char *format, ...) |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
457 { |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
458 char *fmt = format; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
459 object *v; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
460 va_list p; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
461 va_start(p, format); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
462 v = do_mkval(&fmt, &p); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
463 va_end(p); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
464 if (v == NULL) |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
465 fprintf(stderr, "mkvalue: format = \"%s\" \"%s\"\n", format, fmt); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
466 return v; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
467 } |
