Mercurial > cpython-lru_cache-weakref
annotate Python/modsupport.c @ 817:aa633f0defa6 legacy-trunk
Merged with Steve Miale's version
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Mon, 13 Apr 1992 15:53:41 +0000 |
| parents | e4a27d84ea36 |
| children | 39134c99c923 |
| 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 | |
|
817
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
70 /* Helper for getargs() and mkvalue() to scan the length of a format */ |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
71 |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
72 static int countformat PROTO((char *format, int endchar)); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
73 static int countformat(format, endchar) |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
74 char *format; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
75 int endchar; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
76 { |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
77 int count = 0; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
78 int level = 0; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
79 while (level > 0 || *format != endchar) { |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
80 if (*format == '\0') { |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
81 /* Premature end */ |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
82 err_setstr(SystemError, "unmatched paren in format"); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
83 return -1; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
84 } |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
85 else if (*format == '(') { |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
86 if (level == 0) |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
87 count++; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
88 level++; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
89 } |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
90 else if (*format == ')') |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
91 level--; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
92 else if (level == 0 && *format != '#') |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
93 count++; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
94 format++; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
95 } |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
96 return count; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
97 } |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
98 |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
99 |
|
637
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
100 /* Generic argument list parser */ |
| 6 | 101 |
|
637
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
102 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
|
103 static int |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
104 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
|
105 object *arg; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
106 char** p_format; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
107 va_list *p_va; |
| 6 | 108 { |
|
637
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
109 char *format = *p_format; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
110 va_list va = *p_va; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
111 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
112 if (arg == NULL) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
113 return 0; /* Incomplete tuple or list */ |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
114 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
115 switch (*format++) { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
116 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
117 case '('/*')'*/: /* tuple, distributed over C parameters */ { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
118 int i, n; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
119 if (!is_tupleobject(arg)) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
120 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
121 n = gettuplesize(arg); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
122 for (i = 0; i < n; i++) { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
123 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
|
124 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
125 } |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
126 if (*format++ != /*'('*/')') |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
127 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
128 break; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
129 } |
|
817
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
130 |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
131 case 'b': /* byte -- very short int */ { |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
132 char *p = va_arg(va, char *); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
133 if (is_intobject(arg)) |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
134 *p = getintvalue(arg); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
135 else |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
136 return 0; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
137 break; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
138 } |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
139 |
|
637
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
140 case 'h': /* short int */ { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
141 short *p = va_arg(va, short *); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
142 if (is_intobject(arg)) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
143 *p = getintvalue(arg); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
144 else |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
145 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
146 break; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
147 } |
|
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 case 'i': /* int */ { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
150 int *p = va_arg(va, int *); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
151 if (is_intobject(arg)) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
152 *p = getintvalue(arg); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
153 else |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
154 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
155 break; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
156 } |
|
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 case 'l': /* long int */ { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
159 long *p = va_arg(va, long *); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
160 if (is_intobject(arg)) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
161 *p = getintvalue(arg); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
162 else |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
163 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
164 break; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
165 } |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
166 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
167 case 'f': /* float */ { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
168 float *p = va_arg(va, float *); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
169 if (is_floatobject(arg)) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
170 *p = getfloatvalue(arg); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
171 else if (is_intobject(arg)) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
172 *p = (float)getintvalue(arg); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
173 else |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
174 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
175 break; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
176 } |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
177 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
178 case 'd': /* double */ { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
179 double *p = va_arg(va, double *); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
180 if (is_floatobject(arg)) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
181 *p = getfloatvalue(arg); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
182 else if (is_intobject(arg)) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
183 *p = (double)getintvalue(arg); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
184 else |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
185 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
186 break; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
187 } |
|
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 case 'c': /* char */ { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
190 char *p = va_arg(va, char *); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
191 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
|
192 *p = getstringvalue(arg)[0]; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
193 else |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
194 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
195 break; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
196 } |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
197 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
198 case 's': /* string */ { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
199 char **p = va_arg(va, char **); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
200 if (is_stringobject(arg)) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
201 *p = getstringvalue(arg); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
202 else |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
203 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
204 if (*format == '#') { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
205 int *q = va_arg(va, int *); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
206 *q = getstringsize(arg); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
207 format++; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
208 } |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
209 break; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
210 } |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
211 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
212 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
|
213 char **p = va_arg(va, char **); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
214 if (arg == None) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
215 *p = 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
216 else if (is_stringobject(arg)) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
217 *p = getstringvalue(arg); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
218 else |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
219 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
220 if (*format == '#') { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
221 int *q = va_arg(va, int *); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
222 if (arg == None) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
223 *q = 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
224 else |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
225 *q = getstringsize(arg); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
226 format++; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
227 } |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
228 break; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
229 } |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
230 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
231 case 'S': /* string object */ { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
232 object **p = va_arg(va, object **); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
233 if (is_stringobject(arg)) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
234 *p = arg; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
235 else |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
236 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
237 break; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
238 } |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
239 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
240 case 'O': /* object */ { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
241 object **p = va_arg(va, object **); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
242 *p = arg; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
243 break; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
244 } |
| 6 | 245 |
|
637
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
246 default: |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
247 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
|
248 format[-1], format[-1]); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
249 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
250 |
| 6 | 251 } |
|
637
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
252 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
253 *p_va = va; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
254 *p_format = format; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
255 |
| 6 | 256 return 1; |
| 257 } | |
| 258 | |
|
637
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
259 #ifdef USE_STDARG |
| 733 | 260 /* VARARGS2 */ |
|
637
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
261 int getargs(object *arg, char *format, ...) |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
262 #else |
| 733 | 263 /* VARARGS */ |
|
637
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
264 int getargs(va_alist) va_dcl |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
265 #endif |
| 6 | 266 { |
|
637
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
267 char *f; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
268 int ok; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
269 va_list va; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
270 #ifdef USE_STDARG |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
271 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
272 va_start(va, format); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
273 #else |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
274 object *arg; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
275 char *format; |
| 6 | 276 |
|
637
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
277 va_start(va); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
278 arg = va_arg(va, object *); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
279 format = va_arg(va, char *); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
280 #endif |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
281 if (*format == '\0') { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
282 va_end(va); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
283 if (arg != NULL) { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
284 err_setstr(TypeError, "no arguments needed"); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
285 return 0; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
286 } |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
287 return 1; |
| 6 | 288 } |
|
637
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
289 |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
290 f = format; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
291 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
|
292 va_end(va); |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
293 if (!ok) { |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
294 char buf[256]; |
|
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
295 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
|
296 err_setstr(TypeError, buf); |
| 6 | 297 } |
|
637
3cb686c48cdd
New getargs() function: a single varargs function,
Guido van Rossum <guido@python.org>
parents:
488
diff
changeset
|
298 return ok; |
| 6 | 299 } |
| 300 | |
| 301 int | |
| 302 getlongtuplearg(args, a, n) | |
| 303 object *args; | |
| 304 long *a; /* [n] */ | |
| 305 int n; | |
| 306 { | |
| 307 int i; | |
| 308 if (!is_tupleobject(args) || gettuplesize(args) != n) { | |
| 309 return err_badarg(); | |
| 310 } | |
| 311 for (i = 0; i < n; i++) { | |
| 312 object *v = gettupleitem(args, i); | |
| 313 if (!is_intobject(v)) { | |
| 314 return err_badarg(); | |
| 315 } | |
| 316 a[i] = getintvalue(v); | |
| 317 } | |
| 318 return 1; | |
| 319 } | |
| 320 | |
| 321 int | |
| 322 getshorttuplearg(args, a, n) | |
| 323 object *args; | |
| 324 short *a; /* [n] */ | |
| 325 int n; | |
| 326 { | |
| 327 int i; | |
| 328 if (!is_tupleobject(args) || gettuplesize(args) != n) { | |
| 329 return err_badarg(); | |
| 330 } | |
| 331 for (i = 0; i < n; i++) { | |
| 332 object *v = gettupleitem(args, i); | |
| 333 if (!is_intobject(v)) { | |
| 334 return err_badarg(); | |
| 335 } | |
| 336 a[i] = getintvalue(v); | |
| 337 } | |
| 338 return 1; | |
| 339 } | |
| 340 | |
| 341 int | |
| 342 getlonglistarg(args, a, n) | |
| 343 object *args; | |
| 344 long *a; /* [n] */ | |
| 345 int n; | |
| 346 { | |
| 347 int i; | |
| 348 if (!is_listobject(args) || getlistsize(args) != n) { | |
| 349 return err_badarg(); | |
| 350 } | |
| 351 for (i = 0; i < n; i++) { | |
| 352 object *v = getlistitem(args, i); | |
| 353 if (!is_intobject(v)) { | |
| 354 return err_badarg(); | |
| 355 } | |
| 356 a[i] = getintvalue(v); | |
| 357 } | |
| 358 return 1; | |
| 359 } | |
| 360 | |
| 361 int | |
| 362 getshortlistarg(args, a, n) | |
| 363 object *args; | |
| 364 short *a; /* [n] */ | |
| 365 int n; | |
| 366 { | |
| 367 int i; | |
| 368 if (!is_listobject(args) || getlistsize(args) != n) { | |
| 369 return err_badarg(); | |
| 370 } | |
| 371 for (i = 0; i < n; i++) { | |
| 372 object *v = getlistitem(args, i); | |
| 373 if (!is_intobject(v)) { | |
| 374 return err_badarg(); | |
| 375 } | |
| 376 a[i] = getintvalue(v); | |
| 377 } | |
| 378 return 1; | |
| 379 } | |
|
816
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
380 |
|
817
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
381 |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
382 /* Generic function to create a value -- the inverse of getargs() */ |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
383 /* After an original idea and first implementation by Steven Miale */ |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
384 |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
385 static object *do_mktuple PROTO((char**, va_list *, int, int)); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
386 static object *do_mkvalue PROTO((char**, va_list *)); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
387 |
|
816
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
388 static object * |
|
817
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
389 do_mktuple(p_format, p_va, endchar, n) |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
390 char **p_format; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
391 va_list *p_va; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
392 int endchar; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
393 int n; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
394 { |
|
816
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
395 object *v; |
|
817
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
396 int i; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
397 if (n < 0) |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
398 return NULL; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
399 if ((v = newtupleobject(n)) == NULL) |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
400 return NULL; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
401 for (i = 0; i < n; i++) { |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
402 object *w = do_mkvalue(p_format, p_va); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
403 if (w == NULL) { |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
404 DECREF(v); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
405 return NULL; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
406 } |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
407 settupleitem(v, i, w); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
408 } |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
409 if (v != NULL && **p_format != endchar) { |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
410 DECREF(v); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
411 v = NULL; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
412 err_setstr(SystemError, "Unmatched paren in format"); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
413 } |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
414 else if (endchar) |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
415 ++*p_format; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
416 return v; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
417 } |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
418 |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
419 static object * |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
420 do_mkvalue(p_format, p_va) { |
|
816
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
421 |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
422 switch (*(*p_format)++) { |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
423 |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
424 case '(': |
|
817
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
425 return do_mktuple(p_format, p_va, ')', |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
426 countformat(*p_format, ')')); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
427 |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
428 case 'b': |
|
816
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
429 case 'h': |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
430 case 'i': |
|
817
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
431 return newintobject((long)va_arg(*p_va, int)); |
|
816
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
432 |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
433 case 'l': |
|
817
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
434 return newintobject((long)va_arg(*p_va, long)); |
|
816
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
435 |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
436 case 'f': |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
437 case 'd': |
|
817
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
438 return newfloatobject((double)va_arg(*p_va, double)); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
439 |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
440 case 'c': |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
441 { |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
442 char p[1]; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
443 p[0] = va_arg(*p_va, int); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
444 return newsizedstringobject(p, 1); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
445 } |
|
816
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
446 |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
447 case 's': |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
448 case 'z': |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
449 { |
|
817
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
450 object *v; |
|
816
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
451 char *str = va_arg(*p_va, char *); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
452 int n; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
453 if (**p_format == '#') { |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
454 ++*p_format; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
455 n = va_arg(*p_va, int); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
456 } |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
457 else |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
458 n = -1; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
459 if (str == NULL) { |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
460 v = None; |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
461 INCREF(v); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
462 } |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
463 else { |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
464 if (n < 0) |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
465 n = strlen(str); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
466 v = newsizedstringobject(str, n); |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
467 } |
|
817
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
468 return v; |
|
816
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
469 } |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
470 |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
471 case 'S': |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
472 case 'O': |
|
817
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
473 { |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
474 object *v; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
475 v = va_arg(*p_va, object *); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
476 if (v != NULL) |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
477 INCREF(v); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
478 else if (!err_occurred()) |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
479 /* If a NULL was passed because a call |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
480 that should have constructed a value |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
481 failed, that's OK, and we pass the error |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
482 on; but if no error occurred it's not |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
483 clear that the caller knew what she |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
484 was doing. */ |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
485 err_setstr(SystemError, |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
486 "NULL object passed to mkvalue"); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
487 return v; |
|
816
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
488 } |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
489 |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
490 default: |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
491 err_setstr(SystemError, "bad format char passed to mkvalue"); |
|
817
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
492 return NULL; |
|
816
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
493 |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
494 } |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
495 } |
|
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
496 |
|
817
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
497 #ifdef USE_STDARG |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
498 /* VARARGS 2 */ |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
499 object *mkvalue(char *format, ...) |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
500 #else |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
501 /* VARARGS */ |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
502 object *mkvalue(va_alist) va_dcl |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
503 #endif |
|
816
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
504 { |
|
817
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
505 int n; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
506 char *f; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
507 va_list va; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
508 object* retval; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
509 #ifdef USE_STDARG |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
510 va_start(va, format); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
511 #else |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
512 char *format; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
513 |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
514 va_start(va); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
515 format = va_arg(va, char *); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
516 #endif |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
517 f = format; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
518 n = countformat(f, '\0'); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
519 if (n < 0) |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
520 retval = NULL; /* Error in the format */ |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
521 else if (n == 0) { |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
522 retval = None; |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
523 INCREF(retval); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
524 } |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
525 else if (n == 1) |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
526 retval = do_mkvalue(&f, &va); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
527 else |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
528 retval = do_mktuple(&f, &va, '\0', n); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
529 va_end(va); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
530 if (retval == NULL) |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
531 fprintf(stderr, "format \"%s\", f \"%s\"\n", format, f); |
|
aa633f0defa6
Merged with Steve Miale's version
Guido van Rossum <guido@python.org>
parents:
816
diff
changeset
|
532 return retval; |
|
816
e4a27d84ea36
Added mkvalue() function
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
533 } |
