blob: cf0ad269204afce48e0ec4f3b58fdf15f53c8bd2 [file] [log] [blame]
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00001
2/* New getargs implementation */
3
Guido van Rossum79f25d91997-04-29 20:08:16 +00004#include "Python.h"
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00005
Guido van Rossumc1d50531996-08-21 23:38:24 +00006#include <ctype.h>
7
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00008
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00009#ifdef __cplusplus
Guido van Rossum98297ee2007-11-06 21:34:58 +000010extern "C" {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000011#endif
Jeremy Hyltonaf68c872005-12-10 18:50:16 +000012int PyArg_Parse(PyObject *, const char *, ...);
13int PyArg_ParseTuple(PyObject *, const char *, ...);
14int PyArg_VaParse(PyObject *, const char *, va_list);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000015
Tim Petersdbd9ba62000-07-09 03:09:57 +000016int PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000017 const char *, char **, ...);
Brett Cannon711e7d92004-07-10 22:20:32 +000018int PyArg_VaParseTupleAndKeywords(PyObject *, PyObject *,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000019 const char *, char **, va_list);
Brett Cannon711e7d92004-07-10 22:20:32 +000020
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +030021int _PyArg_ParseTupleAndKeywordsFast(PyObject *, PyObject *,
22 struct _PyArg_Parser *, ...);
23int _PyArg_VaParseTupleAndKeywordsFast(PyObject *, PyObject *,
24 struct _PyArg_Parser *, va_list);
25
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000026#ifdef HAVE_DECLSPEC_DLL
27/* Export functions */
Serhiy Storchakaef1585e2015-12-25 20:01:53 +020028PyAPI_FUNC(int) _PyArg_Parse_SizeT(PyObject *, const char *, ...);
29PyAPI_FUNC(int) _PyArg_ParseTuple_SizeT(PyObject *, const char *, ...);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000030PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywords_SizeT(PyObject *, PyObject *,
31 const char *, char **, ...);
32PyAPI_FUNC(PyObject *) _Py_BuildValue_SizeT(const char *, ...);
Serhiy Storchakaef1585e2015-12-25 20:01:53 +020033PyAPI_FUNC(int) _PyArg_VaParse_SizeT(PyObject *, const char *, va_list);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000034PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *, PyObject *,
35 const char *, char **, va_list);
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +030036
37PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywordsFast_SizeT(PyObject *, PyObject *,
38 struct _PyArg_Parser *, ...);
39PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywordsFast_SizeT(PyObject *, PyObject *,
40 struct _PyArg_Parser *, va_list);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000041#endif
42
Martin v. Löwis18e16552006-02-15 17:27:45 +000043#define FLAG_COMPAT 1
44#define FLAG_SIZE_T 2
45
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -040046typedef int (*destr_t)(PyObject *, void *);
47
48
49/* Keep track of "objects" that have been allocated or initialized and
50 which will need to be deallocated or cleaned up somehow if overall
51 parsing fails.
52*/
53typedef struct {
54 void *item;
55 destr_t destructor;
56} freelistentry_t;
57
58typedef struct {
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -040059 freelistentry_t *entries;
Antoine Pitrou7056cb22013-02-17 01:04:57 +010060 int first_available;
61 int entries_malloced;
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -040062} freelist_t;
63
Antoine Pitrou7056cb22013-02-17 01:04:57 +010064#define STATIC_FREELIST_ENTRIES 8
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000065
66/* Forward */
Jeremy Hyltonaf68c872005-12-10 18:50:16 +000067static int vgetargs1(PyObject *, const char *, va_list *, int);
Victor Stinner84bb1cf2013-05-17 00:12:04 +020068static void seterror(Py_ssize_t, const char *, int *, const char *, const char *);
Serhiy Storchakaef1585e2015-12-25 20:01:53 +020069static const char *convertitem(PyObject *, const char **, va_list *, int, int *,
70 char *, size_t, freelist_t *);
71static const char *converttuple(PyObject *, const char **, va_list *, int,
72 int *, char *, size_t, int, freelist_t *);
73static const char *convertsimple(PyObject *, const char **, va_list *, int,
74 char *, size_t, freelist_t *);
75static Py_ssize_t convertbuffer(PyObject *, void **p, const char **);
76static int getbuffer(PyObject *, Py_buffer *, const char**);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000077
Tim Petersdbd9ba62000-07-09 03:09:57 +000078static int vgetargskeywords(PyObject *, PyObject *,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000079 const char *, char **, va_list *, int);
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +030080static int vgetargskeywordsfast(PyObject *, PyObject *,
81 struct _PyArg_Parser *, va_list *, int);
Serhiy Storchakaef1585e2015-12-25 20:01:53 +020082static const char *skipitem(const char **, va_list *, int);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000083
Fred Drake563dfc22001-10-23 14:41:08 +000084int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +000085PyArg_Parse(PyObject *args, const char *format, ...)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000086{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000087 int retval;
88 va_list va;
Guido van Rossum98297ee2007-11-06 21:34:58 +000089
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000090 va_start(va, format);
91 retval = vgetargs1(args, format, &va, FLAG_COMPAT);
92 va_end(va);
93 return retval;
Martin v. Löwis18e16552006-02-15 17:27:45 +000094}
95
96int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +020097_PyArg_Parse_SizeT(PyObject *args, const char *format, ...)
Martin v. Löwis18e16552006-02-15 17:27:45 +000098{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000099 int retval;
100 va_list va;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000101
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000102 va_start(va, format);
103 retval = vgetargs1(args, format, &va, FLAG_COMPAT|FLAG_SIZE_T);
104 va_end(va);
105 return retval;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000106}
107
108
Fred Drake563dfc22001-10-23 14:41:08 +0000109int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000110PyArg_ParseTuple(PyObject *args, const char *format, ...)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000111{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000112 int retval;
113 va_list va;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000115 va_start(va, format);
116 retval = vgetargs1(args, format, &va, 0);
117 va_end(va);
118 return retval;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000119}
120
Martin v. Löwis18e16552006-02-15 17:27:45 +0000121int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200122_PyArg_ParseTuple_SizeT(PyObject *args, const char *format, ...)
Martin v. Löwis18e16552006-02-15 17:27:45 +0000123{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000124 int retval;
125 va_list va;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000127 va_start(va, format);
128 retval = vgetargs1(args, format, &va, FLAG_SIZE_T);
129 va_end(va);
130 return retval;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000131}
132
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000133
134int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000135PyArg_VaParse(PyObject *args, const char *format, va_list va)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000136{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000137 va_list lva;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000138
Alexander Belopolskyf0f45142010-08-11 17:31:17 +0000139 Py_VA_COPY(lva, va);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000140
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000141 return vgetargs1(args, format, &lva, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000142}
143
Martin v. Löwis18e16552006-02-15 17:27:45 +0000144int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200145_PyArg_VaParse_SizeT(PyObject *args, const char *format, va_list va)
Martin v. Löwis18e16552006-02-15 17:27:45 +0000146{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000147 va_list lva;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000148
Alexander Belopolskyf0f45142010-08-11 17:31:17 +0000149 Py_VA_COPY(lva, va);
Martin v. Löwis18e16552006-02-15 17:27:45 +0000150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 return vgetargs1(args, format, &lva, FLAG_SIZE_T);
Martin v. Löwis18e16552006-02-15 17:27:45 +0000152}
153
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000154
Martin v. Löwise6bbb4d2003-05-03 10:00:22 +0000155/* Handle cleanup of allocated memory in case of exception */
156
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -0400157static int
158cleanup_ptr(PyObject *self, void *ptr)
Antoine Pitrouf71995782008-08-29 18:37:05 +0000159{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000160 if (ptr) {
161 PyMem_FREE(ptr);
162 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000163 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +0000164}
165
Martin v. Löwise6bbb4d2003-05-03 10:00:22 +0000166static int
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -0400167cleanup_buffer(PyObject *self, void *ptr)
Martin v. Löwise6bbb4d2003-05-03 10:00:22 +0000168{
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -0400169 Py_buffer *buf = (Py_buffer *)ptr;
170 if (buf) {
171 PyBuffer_Release(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000172 }
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -0400173 return 0;
174}
175
176static int
177addcleanup(void *ptr, freelist_t *freelist, destr_t destructor)
178{
179 int index;
180
181 index = freelist->first_available;
182 freelist->first_available += 1;
183
184 freelist->entries[index].item = ptr;
185 freelist->entries[index].destructor = destructor;
186
187 return 0;
188}
189
190static int
191cleanreturn(int retval, freelist_t *freelist)
192{
193 int index;
194
195 if (retval == 0) {
196 /* A failure occurred, therefore execute all of the cleanup
197 functions.
198 */
199 for (index = 0; index < freelist->first_available; ++index) {
200 freelist->entries[index].destructor(NULL,
201 freelist->entries[index].item);
202 }
203 }
Antoine Pitrou7056cb22013-02-17 01:04:57 +0100204 if (freelist->entries_malloced)
205 PyMem_FREE(freelist->entries);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000206 return retval;
Martin v. Löwise6bbb4d2003-05-03 10:00:22 +0000207}
208
209
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000210static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000211vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000212{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000213 char msgbuf[256];
214 int levels[32];
215 const char *fname = NULL;
216 const char *message = NULL;
217 int min = -1;
218 int max = 0;
219 int level = 0;
220 int endfmt = 0;
221 const char *formatsave = format;
222 Py_ssize_t i, len;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200223 const char *msg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000224 int compat = flags & FLAG_COMPAT;
Benjamin Peterson40be9e52014-02-11 10:09:27 -0500225 freelistentry_t static_entries[STATIC_FREELIST_ENTRIES];
226 freelist_t freelist;
227
228 freelist.entries = static_entries;
229 freelist.first_available = 0;
230 freelist.entries_malloced = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000232 assert(compat || (args != (PyObject*)NULL));
233 flags = flags & ~FLAG_COMPAT;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000235 while (endfmt == 0) {
236 int c = *format++;
237 switch (c) {
238 case '(':
239 if (level == 0)
240 max++;
241 level++;
242 if (level >= 30)
243 Py_FatalError("too many tuple nesting levels "
244 "in argument format string");
245 break;
246 case ')':
247 if (level == 0)
248 Py_FatalError("excess ')' in getargs format");
249 else
250 level--;
251 break;
252 case '\0':
253 endfmt = 1;
254 break;
255 case ':':
256 fname = format;
257 endfmt = 1;
258 break;
259 case ';':
260 message = format;
261 endfmt = 1;
262 break;
Antoine Pitrou7056cb22013-02-17 01:04:57 +0100263 case '|':
264 if (level == 0)
265 min = max;
266 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000267 default:
268 if (level == 0) {
Antoine Pitrou7056cb22013-02-17 01:04:57 +0100269 if (Py_ISALPHA(Py_CHARMASK(c)))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000270 if (c != 'e') /* skip encoded */
271 max++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000272 }
273 break;
274 }
275 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000277 if (level != 0)
278 Py_FatalError(/* '(' */ "missing ')' in getargs format");
Guido van Rossum98297ee2007-11-06 21:34:58 +0000279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000280 if (min < 0)
281 min = max;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000283 format = formatsave;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000284
Antoine Pitrou7056cb22013-02-17 01:04:57 +0100285 if (max > STATIC_FREELIST_ENTRIES) {
286 freelist.entries = PyMem_NEW(freelistentry_t, max);
287 if (freelist.entries == NULL) {
288 PyErr_NoMemory();
289 return 0;
290 }
291 freelist.entries_malloced = 1;
Benjamin Peterson7ed67272012-03-16 12:21:02 -0500292 }
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -0400293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000294 if (compat) {
295 if (max == 0) {
296 if (args == NULL)
297 return 1;
Victor Stinner6ced7c42011-03-21 18:15:42 +0100298 PyErr_Format(PyExc_TypeError,
299 "%.200s%s takes no arguments",
300 fname==NULL ? "function" : fname,
301 fname==NULL ? "" : "()");
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -0400302 return cleanreturn(0, &freelist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000303 }
304 else if (min == 1 && max == 1) {
305 if (args == NULL) {
Victor Stinner6ced7c42011-03-21 18:15:42 +0100306 PyErr_Format(PyExc_TypeError,
307 "%.200s%s takes at least one argument",
308 fname==NULL ? "function" : fname,
309 fname==NULL ? "" : "()");
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -0400310 return cleanreturn(0, &freelist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000311 }
312 msg = convertitem(args, &format, p_va, flags, levels,
313 msgbuf, sizeof(msgbuf), &freelist);
314 if (msg == NULL)
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -0400315 return cleanreturn(1, &freelist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000316 seterror(levels[0], msg, levels+1, fname, message);
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -0400317 return cleanreturn(0, &freelist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000318 }
319 else {
320 PyErr_SetString(PyExc_SystemError,
321 "old style getargs format uses new features");
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -0400322 return cleanreturn(0, &freelist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000323 }
324 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000325
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000326 if (!PyTuple_Check(args)) {
327 PyErr_SetString(PyExc_SystemError,
328 "new style getargs format but argument is not a tuple");
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -0400329 return cleanreturn(0, &freelist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000330 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000332 len = PyTuple_GET_SIZE(args);
Guido van Rossum98297ee2007-11-06 21:34:58 +0000333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 if (len < min || max < len) {
Victor Stinner6ced7c42011-03-21 18:15:42 +0100335 if (message == NULL)
336 PyErr_Format(PyExc_TypeError,
337 "%.150s%s takes %s %d argument%s (%ld given)",
338 fname==NULL ? "function" : fname,
339 fname==NULL ? "" : "()",
340 min==max ? "exactly"
341 : len < min ? "at least" : "at most",
342 len < min ? min : max,
343 (len < min ? min : max) == 1 ? "" : "s",
344 Py_SAFE_DOWNCAST(len, Py_ssize_t, long));
345 else
346 PyErr_SetString(PyExc_TypeError, message);
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -0400347 return cleanreturn(0, &freelist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000348 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000350 for (i = 0; i < len; i++) {
351 if (*format == '|')
352 format++;
353 msg = convertitem(PyTuple_GET_ITEM(args, i), &format, p_va,
354 flags, levels, msgbuf,
355 sizeof(msgbuf), &freelist);
356 if (msg) {
Serhiy Storchakac4b813d2016-02-08 01:06:11 +0200357 seterror(i+1, msg, levels, fname, message);
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -0400358 return cleanreturn(0, &freelist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000359 }
360 }
Guido van Rossum231a41e1997-12-09 20:36:39 +0000361
Antoine Pitrou4de74572013-02-09 23:11:27 +0100362 if (*format != '\0' && !Py_ISALPHA(Py_CHARMASK(*format)) &&
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000363 *format != '(' &&
364 *format != '|' && *format != ':' && *format != ';') {
365 PyErr_Format(PyExc_SystemError,
366 "bad format string: %.200s", formatsave);
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -0400367 return cleanreturn(0, &freelist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000368 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000369
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -0400370 return cleanreturn(1, &freelist);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000371}
372
373
374
375static void
Victor Stinner84bb1cf2013-05-17 00:12:04 +0200376seterror(Py_ssize_t iarg, const char *msg, int *levels, const char *fname,
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000377 const char *message)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000378{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000379 char buf[512];
380 int i;
381 char *p = buf;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000383 if (PyErr_Occurred())
384 return;
385 else if (message == NULL) {
386 if (fname != NULL) {
387 PyOS_snprintf(p, sizeof(buf), "%.200s() ", fname);
388 p += strlen(p);
389 }
390 if (iarg != 0) {
391 PyOS_snprintf(p, sizeof(buf) - (p - buf),
Richard Oudkerk25296ce2013-05-18 17:35:19 +0100392 "argument %" PY_FORMAT_SIZE_T "d", iarg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000393 i = 0;
394 p += strlen(p);
Georg Brandl142ad662013-10-14 07:01:11 +0200395 while (i < 32 && levels[i] > 0 && (int)(p-buf) < 220) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 PyOS_snprintf(p, sizeof(buf) - (p - buf),
397 ", item %d", levels[i]-1);
398 p += strlen(p);
399 i++;
400 }
401 }
402 else {
403 PyOS_snprintf(p, sizeof(buf) - (p - buf), "argument");
404 p += strlen(p);
405 }
406 PyOS_snprintf(p, sizeof(buf) - (p - buf), " %.256s", msg);
407 message = buf;
408 }
Serhiy Storchaka4cd63ef2016-02-08 01:22:47 +0200409 if (msg[0] == '(') {
410 PyErr_SetString(PyExc_SystemError, message);
411 }
412 else {
413 PyErr_SetString(PyExc_TypeError, message);
414 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000415}
416
417
418/* Convert a tuple argument.
419 On entry, *p_format points to the character _after_ the opening '('.
420 On successful exit, *p_format points to the closing ')'.
421 If successful:
422 *p_format and *p_va are updated,
423 *levels and *msgbuf are untouched,
424 and NULL is returned.
425 If the argument is invalid:
426 *p_format is unchanged,
427 *p_va is undefined,
428 *levels is a 0-terminated list of item numbers,
429 *msgbuf contains an error message, whose format is:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000430 "must be <typename1>, not <typename2>", where:
431 <typename1> is the name of the expected type, and
432 <typename2> is the name of the actual type,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000433 and msgbuf is returned.
434*/
435
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200436static const char *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000437converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
Guido van Rossum98297ee2007-11-06 21:34:58 +0000438 int *levels, char *msgbuf, size_t bufsize, int toplevel,
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -0400439 freelist_t *freelist)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000440{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000441 int level = 0;
442 int n = 0;
443 const char *format = *p_format;
444 int i;
Victor Stinner74387f52013-11-18 01:21:12 +0100445 Py_ssize_t len;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000447 for (;;) {
448 int c = *format++;
449 if (c == '(') {
450 if (level == 0)
451 n++;
452 level++;
453 }
454 else if (c == ')') {
455 if (level == 0)
456 break;
457 level--;
458 }
459 else if (c == ':' || c == ';' || c == '\0')
460 break;
Antoine Pitrou4de74572013-02-09 23:11:27 +0100461 else if (level == 0 && Py_ISALPHA(Py_CHARMASK(c)))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000462 n++;
463 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000464
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000465 if (!PySequence_Check(arg) || PyBytes_Check(arg)) {
466 levels[0] = 0;
467 PyOS_snprintf(msgbuf, bufsize,
468 toplevel ? "expected %d arguments, not %.50s" :
469 "must be %d-item sequence, not %.50s",
470 n,
471 arg == Py_None ? "None" : arg->ob_type->tp_name);
472 return msgbuf;
473 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000474
Victor Stinner74387f52013-11-18 01:21:12 +0100475 len = PySequence_Size(arg);
476 if (len != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000477 levels[0] = 0;
Victor Stinner74387f52013-11-18 01:21:12 +0100478 if (toplevel) {
479 PyOS_snprintf(msgbuf, bufsize,
480 "expected %d arguments, not %" PY_FORMAT_SIZE_T "d",
481 n, len);
482 }
483 else {
484 PyOS_snprintf(msgbuf, bufsize,
485 "must be sequence of length %d, "
486 "not %" PY_FORMAT_SIZE_T "d",
487 n, len);
488 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000489 return msgbuf;
490 }
Ka-Ping Yee20579702001-01-15 22:14:16 +0000491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 format = *p_format;
493 for (i = 0; i < n; i++) {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200494 const char *msg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 PyObject *item;
496 item = PySequence_GetItem(arg, i);
497 if (item == NULL) {
498 PyErr_Clear();
499 levels[0] = i+1;
500 levels[1] = 0;
501 strncpy(msgbuf, "is not retrievable", bufsize);
502 return msgbuf;
503 }
504 msg = convertitem(item, &format, p_va, flags, levels+1,
505 msgbuf, bufsize, freelist);
506 /* PySequence_GetItem calls tp->sq_item, which INCREFs */
507 Py_XDECREF(item);
508 if (msg != NULL) {
509 levels[0] = i+1;
510 return msg;
511 }
512 }
Ka-Ping Yee20579702001-01-15 22:14:16 +0000513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 *p_format = format;
515 return NULL;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000516}
517
518
519/* Convert a single item. */
520
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200521static const char *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000522convertitem(PyObject *arg, const char **p_format, va_list *p_va, int flags,
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -0400523 int *levels, char *msgbuf, size_t bufsize, freelist_t *freelist)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000524{
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200525 const char *msg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 const char *format = *p_format;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000528 if (*format == '(' /* ')' */) {
529 format++;
530 msg = converttuple(arg, &format, p_va, flags, levels, msgbuf,
531 bufsize, 0, freelist);
532 if (msg == NULL)
533 format++;
534 }
535 else {
536 msg = convertsimple(arg, &format, p_va, flags,
537 msgbuf, bufsize, freelist);
538 if (msg != NULL)
539 levels[0] = 0;
540 }
541 if (msg == NULL)
542 *p_format = format;
543 return msg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000544}
545
546
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000547
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000548/* Format an error message generated by convertsimple(). */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000549
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200550static const char *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000551converterr(const char *expected, PyObject *arg, char *msgbuf, size_t bufsize)
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000552{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 assert(expected != NULL);
554 assert(arg != NULL);
Serhiy Storchakac4b813d2016-02-08 01:06:11 +0200555 if (expected[0] == '(') {
556 PyOS_snprintf(msgbuf, bufsize,
557 "%.100s", expected);
558 }
559 else {
560 PyOS_snprintf(msgbuf, bufsize,
561 "must be %.50s, not %.50s", expected,
562 arg == Py_None ? "None" : arg->ob_type->tp_name);
563 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 return msgbuf;
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000565}
566
567#define CONV_UNICODE "(unicode conversion error)"
568
Guido van Rossum45aecf42006-03-15 04:58:47 +0000569/* Explicitly check for float arguments when integers are expected.
570 Return 1 for error, 0 if ok. */
Neil Schemenauer5042da62003-02-04 20:59:40 +0000571static int
572float_argument_error(PyObject *arg)
573{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 if (PyFloat_Check(arg)) {
575 PyErr_SetString(PyExc_TypeError,
576 "integer argument expected, got float" );
577 return 1;
578 }
579 else
580 return 0;
Neil Schemenauer5042da62003-02-04 20:59:40 +0000581}
582
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000583/* Convert a non-tuple argument. Return NULL if conversion went OK,
584 or a string with a message describing the failure. The message is
585 formatted as "must be <desired type>, not <actual type>".
586 When failing, an exception may or may not have been raised.
Georg Brandl6dd14612005-09-14 19:29:53 +0000587 Don't call if a tuple is expected.
588
589 When you add new format codes, please don't forget poor skipitem() below.
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000590*/
591
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200592static const char *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000593convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -0400594 char *msgbuf, size_t bufsize, freelist_t *freelist)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000595{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 /* For # codes */
597#define FETCH_SIZE int *q=NULL;Py_ssize_t *q2=NULL;\
598 if (flags & FLAG_SIZE_T) q2=va_arg(*p_va, Py_ssize_t*); \
599 else q=va_arg(*p_va, int*);
Victor Stinnerb3c9e072011-01-04 02:07:34 +0000600#define STORE_SIZE(s) \
601 if (flags & FLAG_SIZE_T) \
602 *q2=s; \
603 else { \
604 if (INT_MAX < s) { \
605 PyErr_SetString(PyExc_OverflowError, \
606 "size does not fit in an int"); \
607 return converterr("", arg, msgbuf, bufsize); \
608 } \
Victor Stinner9550ef32013-06-05 01:18:13 +0200609 *q = (int)s; \
Victor Stinnerb3c9e072011-01-04 02:07:34 +0000610 }
Martin v. Löwis18e16552006-02-15 17:27:45 +0000611#define BUFFER_LEN ((flags & FLAG_SIZE_T) ? *q2:*q)
Victor Stinner6ab8e822011-01-04 11:16:49 +0000612#define RETURN_ERR_OCCURRED return msgbuf
Martin v. Löwis18e16552006-02-15 17:27:45 +0000613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 const char *format = *p_format;
615 char c = *format++;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200616 char *sarg;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 switch (c) {
Guido van Rossum98297ee2007-11-06 21:34:58 +0000619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 case 'b': { /* unsigned byte -- very short int */
621 char *p = va_arg(*p_va, char *);
622 long ival;
623 if (float_argument_error(arg))
Victor Stinner6ab8e822011-01-04 11:16:49 +0000624 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 ival = PyLong_AsLong(arg);
626 if (ival == -1 && PyErr_Occurred())
Victor Stinner6ab8e822011-01-04 11:16:49 +0000627 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 else if (ival < 0) {
629 PyErr_SetString(PyExc_OverflowError,
Victor Stinner6ab8e822011-01-04 11:16:49 +0000630 "unsigned byte integer is less than minimum");
631 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 }
633 else if (ival > UCHAR_MAX) {
634 PyErr_SetString(PyExc_OverflowError,
Victor Stinner6ab8e822011-01-04 11:16:49 +0000635 "unsigned byte integer is greater than maximum");
636 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 }
638 else
639 *p = (unsigned char) ival;
640 break;
641 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 case 'B': {/* byte sized bitfield - both signed and unsigned
644 values allowed */
645 char *p = va_arg(*p_va, char *);
646 long ival;
647 if (float_argument_error(arg))
Victor Stinner6ab8e822011-01-04 11:16:49 +0000648 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 ival = PyLong_AsUnsignedLongMask(arg);
650 if (ival == -1 && PyErr_Occurred())
Victor Stinner6ab8e822011-01-04 11:16:49 +0000651 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 else
653 *p = (unsigned char) ival;
654 break;
655 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000657 case 'h': {/* signed short int */
658 short *p = va_arg(*p_va, short *);
659 long ival;
660 if (float_argument_error(arg))
Victor Stinner6ab8e822011-01-04 11:16:49 +0000661 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 ival = PyLong_AsLong(arg);
663 if (ival == -1 && PyErr_Occurred())
Victor Stinner6ab8e822011-01-04 11:16:49 +0000664 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000665 else if (ival < SHRT_MIN) {
666 PyErr_SetString(PyExc_OverflowError,
Victor Stinner6ab8e822011-01-04 11:16:49 +0000667 "signed short integer is less than minimum");
668 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 }
670 else if (ival > SHRT_MAX) {
671 PyErr_SetString(PyExc_OverflowError,
Victor Stinner6ab8e822011-01-04 11:16:49 +0000672 "signed short integer is greater than maximum");
673 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 }
675 else
676 *p = (short) ival;
677 break;
678 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000679
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000680 case 'H': { /* short int sized bitfield, both signed and
681 unsigned allowed */
682 unsigned short *p = va_arg(*p_va, unsigned short *);
683 long ival;
684 if (float_argument_error(arg))
Victor Stinner6ab8e822011-01-04 11:16:49 +0000685 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 ival = PyLong_AsUnsignedLongMask(arg);
687 if (ival == -1 && PyErr_Occurred())
Victor Stinner6ab8e822011-01-04 11:16:49 +0000688 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 else
690 *p = (unsigned short) ival;
691 break;
692 }
Martin v. Löwis18e16552006-02-15 17:27:45 +0000693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000694 case 'i': {/* signed int */
695 int *p = va_arg(*p_va, int *);
696 long ival;
697 if (float_argument_error(arg))
Victor Stinner6ab8e822011-01-04 11:16:49 +0000698 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 ival = PyLong_AsLong(arg);
700 if (ival == -1 && PyErr_Occurred())
Victor Stinner6ab8e822011-01-04 11:16:49 +0000701 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000702 else if (ival > INT_MAX) {
703 PyErr_SetString(PyExc_OverflowError,
Victor Stinner6ab8e822011-01-04 11:16:49 +0000704 "signed integer is greater than maximum");
705 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 }
707 else if (ival < INT_MIN) {
708 PyErr_SetString(PyExc_OverflowError,
Victor Stinner6ab8e822011-01-04 11:16:49 +0000709 "signed integer is less than minimum");
710 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000711 }
712 else
713 *p = ival;
714 break;
715 }
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 case 'I': { /* int sized bitfield, both signed and
718 unsigned allowed */
719 unsigned int *p = va_arg(*p_va, unsigned int *);
720 unsigned int ival;
721 if (float_argument_error(arg))
Victor Stinner6ab8e822011-01-04 11:16:49 +0000722 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 ival = (unsigned int)PyLong_AsUnsignedLongMask(arg);
724 if (ival == (unsigned int)-1 && PyErr_Occurred())
Victor Stinner6ab8e822011-01-04 11:16:49 +0000725 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000726 else
727 *p = ival;
728 break;
729 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000731 case 'n': /* Py_ssize_t */
732 {
733 PyObject *iobj;
734 Py_ssize_t *p = va_arg(*p_va, Py_ssize_t *);
735 Py_ssize_t ival = -1;
736 if (float_argument_error(arg))
Victor Stinner6ab8e822011-01-04 11:16:49 +0000737 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000738 iobj = PyNumber_Index(arg);
739 if (iobj != NULL) {
740 ival = PyLong_AsSsize_t(iobj);
741 Py_DECREF(iobj);
742 }
743 if (ival == -1 && PyErr_Occurred())
Victor Stinner6ab8e822011-01-04 11:16:49 +0000744 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 *p = ival;
746 break;
747 }
748 case 'l': {/* long int */
749 long *p = va_arg(*p_va, long *);
750 long ival;
751 if (float_argument_error(arg))
Victor Stinner6ab8e822011-01-04 11:16:49 +0000752 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000753 ival = PyLong_AsLong(arg);
754 if (ival == -1 && PyErr_Occurred())
Victor Stinner6ab8e822011-01-04 11:16:49 +0000755 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000756 else
757 *p = ival;
758 break;
759 }
Thomas Hellera4ea6032003-04-17 18:55:45 +0000760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000761 case 'k': { /* long sized bitfield */
762 unsigned long *p = va_arg(*p_va, unsigned long *);
763 unsigned long ival;
764 if (PyLong_Check(arg))
765 ival = PyLong_AsUnsignedLongMask(arg);
766 else
Serhiy Storchakac4b813d2016-02-08 01:06:11 +0200767 return converterr("int", arg, msgbuf, bufsize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 *p = ival;
769 break;
770 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000771
Guido van Rossum3dbba6e1999-01-25 21:48:56 +0000772#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 case 'L': {/* PY_LONG_LONG */
774 PY_LONG_LONG *p = va_arg( *p_va, PY_LONG_LONG * );
775 PY_LONG_LONG ival;
Mark Dickinsonc7301312010-06-10 16:05:10 +0000776 if (float_argument_error(arg))
Victor Stinner6ab8e822011-01-04 11:16:49 +0000777 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 ival = PyLong_AsLongLong(arg);
Mark Dickinsonc7301312010-06-10 16:05:10 +0000779 if (ival == (PY_LONG_LONG)-1 && PyErr_Occurred())
Victor Stinner6ab8e822011-01-04 11:16:49 +0000780 RETURN_ERR_OCCURRED;
Mark Dickinsonc7301312010-06-10 16:05:10 +0000781 else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000782 *p = ival;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000783 break;
784 }
Thomas Hellera4ea6032003-04-17 18:55:45 +0000785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 case 'K': { /* long long sized bitfield */
787 unsigned PY_LONG_LONG *p = va_arg(*p_va, unsigned PY_LONG_LONG *);
788 unsigned PY_LONG_LONG ival;
789 if (PyLong_Check(arg))
790 ival = PyLong_AsUnsignedLongLongMask(arg);
791 else
Serhiy Storchakac4b813d2016-02-08 01:06:11 +0200792 return converterr("int", arg, msgbuf, bufsize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000793 *p = ival;
794 break;
795 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000796#endif
Guido van Rossum98297ee2007-11-06 21:34:58 +0000797
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000798 case 'f': {/* float */
799 float *p = va_arg(*p_va, float *);
800 double dval = PyFloat_AsDouble(arg);
801 if (PyErr_Occurred())
Victor Stinner6ab8e822011-01-04 11:16:49 +0000802 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000803 else
804 *p = (float) dval;
805 break;
806 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000807
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000808 case 'd': {/* double */
809 double *p = va_arg(*p_va, double *);
810 double dval = PyFloat_AsDouble(arg);
811 if (PyErr_Occurred())
Victor Stinner6ab8e822011-01-04 11:16:49 +0000812 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000813 else
814 *p = dval;
815 break;
816 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000818 case 'D': {/* complex double */
819 Py_complex *p = va_arg(*p_va, Py_complex *);
820 Py_complex cval;
821 cval = PyComplex_AsCComplex(arg);
822 if (PyErr_Occurred())
Victor Stinner6ab8e822011-01-04 11:16:49 +0000823 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 else
825 *p = cval;
826 break;
827 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000829 case 'c': {/* char */
830 char *p = va_arg(*p_va, char *);
831 if (PyBytes_Check(arg) && PyBytes_Size(arg) == 1)
832 *p = PyBytes_AS_STRING(arg)[0];
Eli Bendersky906b88f2011-07-29 07:05:08 +0300833 else if (PyByteArray_Check(arg) && PyByteArray_Size(arg) == 1)
834 *p = PyByteArray_AS_STRING(arg)[0];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000835 else
836 return converterr("a byte string of length 1", arg, msgbuf, bufsize);
837 break;
838 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000839
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000840 case 'C': {/* unicode char */
841 int *p = va_arg(*p_va, int *);
Victor Stinnere1335c72011-10-04 20:53:03 +0200842 int kind;
843 void *data;
844
845 if (!PyUnicode_Check(arg))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 return converterr("a unicode character", arg, msgbuf, bufsize);
Victor Stinnere1335c72011-10-04 20:53:03 +0200847
848 if (PyUnicode_READY(arg))
849 RETURN_ERR_OCCURRED;
850
851 if (PyUnicode_GET_LENGTH(arg) != 1)
852 return converterr("a unicode character", arg, msgbuf, bufsize);
853
854 kind = PyUnicode_KIND(arg);
855 data = PyUnicode_DATA(arg);
856 *p = PyUnicode_READ(kind, data, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000857 break;
858 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000859
Larry Hastingsfaf91e72012-05-05 16:54:29 -0700860 case 'p': {/* boolean *p*redicate */
861 int *p = va_arg(*p_va, int *);
862 int val = PyObject_IsTrue(arg);
863 if (val > 0)
864 *p = 1;
865 else if (val == 0)
866 *p = 0;
867 else
868 RETURN_ERR_OCCURRED;
869 break;
870 }
871
Victor Stinner3dcb5ac2010-06-08 22:54:19 +0000872 /* XXX WAAAAH! 's', 'y', 'z', 'u', 'Z', 'e', 'w' codes all
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000873 need to be cleaned up! */
Guido van Rossum98297ee2007-11-06 21:34:58 +0000874
Serhiy Storchakab757c832014-12-05 22:25:22 +0200875 case 'y': {/* any bytes-like object */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 void **p = (void **)va_arg(*p_va, char **);
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200877 const char *buf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 Py_ssize_t count;
879 if (*format == '*') {
880 if (getbuffer(arg, (Py_buffer*)p, &buf) < 0)
881 return converterr(buf, arg, msgbuf, bufsize);
882 format++;
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -0400883 if (addcleanup(p, freelist, cleanup_buffer)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000884 return converterr(
885 "(cleanup problem)",
886 arg, msgbuf, bufsize);
887 }
888 break;
889 }
890 count = convertbuffer(arg, p, &buf);
891 if (count < 0)
892 return converterr(buf, arg, msgbuf, bufsize);
Victor Stinner06e49dd2010-06-13 18:21:50 +0000893 if (*format == '#') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000894 FETCH_SIZE;
895 STORE_SIZE(count);
896 format++;
Victor Stinner06e49dd2010-06-13 18:21:50 +0000897 } else {
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300898 if (strlen(*p) != (size_t)count) {
899 PyErr_SetString(PyExc_ValueError, "embedded null byte");
900 RETURN_ERR_OCCURRED;
901 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 }
903 break;
904 }
Walter Dörwald612344f2007-05-04 19:28:21 +0000905
Serhiy Storchakab757c832014-12-05 22:25:22 +0200906 case 's': /* text string or bytes-like object */
907 case 'z': /* text string, bytes-like object or None */
Victor Stinner3c9e6e92010-06-24 22:31:12 +0000908 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 if (*format == '*') {
Victor Stinner3c9e6e92010-06-24 22:31:12 +0000910 /* "s*" or "z*" */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 Py_buffer *p = (Py_buffer *)va_arg(*p_va, Py_buffer *);
Martin v. Löwis423be952008-08-13 15:53:07 +0000912
Victor Stinner3c9e6e92010-06-24 22:31:12 +0000913 if (c == 'z' && arg == Py_None)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 PyBuffer_FillInfo(p, NULL, NULL, 0, 1, 0);
915 else if (PyUnicode_Check(arg)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200916 Py_ssize_t len;
917 sarg = PyUnicode_AsUTF8AndSize(arg, &len);
918 if (sarg == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000919 return converterr(CONV_UNICODE,
920 arg, msgbuf, bufsize);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200921 PyBuffer_FillInfo(p, arg, sarg, len, 1, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000922 }
Serhiy Storchakab757c832014-12-05 22:25:22 +0200923 else { /* any bytes-like object */
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200924 const char *buf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 if (getbuffer(arg, p, &buf) < 0)
926 return converterr(buf, arg, msgbuf, bufsize);
927 }
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -0400928 if (addcleanup(p, freelist, cleanup_buffer)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929 return converterr(
930 "(cleanup problem)",
931 arg, msgbuf, bufsize);
932 }
933 format++;
Serhiy Storchakab757c832014-12-05 22:25:22 +0200934 } else if (*format == '#') { /* a string or read-only bytes-like object */
Victor Stinner3c9e6e92010-06-24 22:31:12 +0000935 /* "s#" or "z#" */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 void **p = (void **)va_arg(*p_va, char **);
937 FETCH_SIZE;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000938
Victor Stinner3c9e6e92010-06-24 22:31:12 +0000939 if (c == 'z' && arg == Py_None) {
940 *p = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 STORE_SIZE(0);
942 }
943 else if (PyUnicode_Check(arg)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200944 Py_ssize_t len;
945 sarg = PyUnicode_AsUTF8AndSize(arg, &len);
946 if (sarg == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 return converterr(CONV_UNICODE,
948 arg, msgbuf, bufsize);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200949 *p = sarg;
950 STORE_SIZE(len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000951 }
Serhiy Storchakab757c832014-12-05 22:25:22 +0200952 else { /* read-only bytes-like object */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 /* XXX Really? */
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200954 const char *buf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000955 Py_ssize_t count = convertbuffer(arg, p, &buf);
956 if (count < 0)
957 return converterr(buf, arg, msgbuf, bufsize);
958 STORE_SIZE(count);
959 }
960 format++;
961 } else {
Victor Stinner3c9e6e92010-06-24 22:31:12 +0000962 /* "s" or "z" */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 char **p = va_arg(*p_va, char **);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200964 Py_ssize_t len;
965 sarg = NULL;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000966
Victor Stinner3c9e6e92010-06-24 22:31:12 +0000967 if (c == 'z' && arg == Py_None)
968 *p = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 else if (PyUnicode_Check(arg)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200970 sarg = PyUnicode_AsUTF8AndSize(arg, &len);
971 if (sarg == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 return converterr(CONV_UNICODE,
973 arg, msgbuf, bufsize);
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300974 if (strlen(sarg) != (size_t)len) {
975 PyErr_SetString(PyExc_ValueError, "embedded null character");
976 RETURN_ERR_OCCURRED;
977 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200978 *p = sarg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 }
980 else
Victor Stinner3c9e6e92010-06-24 22:31:12 +0000981 return converterr(c == 'z' ? "str or None" : "str",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000982 arg, msgbuf, bufsize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 }
984 break;
985 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000986
Victor Stinner3c9e6e92010-06-24 22:31:12 +0000987 case 'u': /* raw unicode buffer (Py_UNICODE *) */
988 case 'Z': /* raw unicode buffer or None */
989 {
Brett Cannonb94767f2011-02-22 20:15:44 +0000990 Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
991
Serhiy Storchakab757c832014-12-05 22:25:22 +0200992 if (*format == '#') {
Serhiy Storchakad6e53da2015-04-19 21:11:30 +0300993 /* "u#" or "Z#" */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 FETCH_SIZE;
Travis E. Oliphantddacf962007-10-13 21:03:27 +0000995
Victor Stinner3c9e6e92010-06-24 22:31:12 +0000996 if (c == 'Z' && arg == Py_None) {
997 *p = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 STORE_SIZE(0);
999 }
1000 else if (PyUnicode_Check(arg)) {
Victor Stinnerbeac78b2011-10-11 21:55:01 +02001001 Py_ssize_t len;
1002 *p = PyUnicode_AsUnicodeAndSize(arg, &len);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001003 if (*p == NULL)
1004 RETURN_ERR_OCCURRED;
Victor Stinnerbeac78b2011-10-11 21:55:01 +02001005 STORE_SIZE(len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 }
Victor Stinner5216e6d2010-06-08 21:45:51 +00001007 else
Serhiy Storchakad6e53da2015-04-19 21:11:30 +03001008 return converterr(c == 'Z' ? "str or None" : "str",
1009 arg, msgbuf, bufsize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 format++;
1011 } else {
Serhiy Storchakad6e53da2015-04-19 21:11:30 +03001012 /* "u" or "Z" */
Victor Stinner3c9e6e92010-06-24 22:31:12 +00001013 if (c == 'Z' && arg == Py_None)
1014 *p = NULL;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001015 else if (PyUnicode_Check(arg)) {
Victor Stinnerbeac78b2011-10-11 21:55:01 +02001016 Py_ssize_t len;
1017 *p = PyUnicode_AsUnicodeAndSize(arg, &len);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001018 if (*p == NULL)
1019 RETURN_ERR_OCCURRED;
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001020 if (Py_UNICODE_strlen(*p) != (size_t)len) {
1021 PyErr_SetString(PyExc_ValueError, "embedded null character");
1022 RETURN_ERR_OCCURRED;
1023 }
Victor Stinner06e49dd2010-06-13 18:21:50 +00001024 } else
Victor Stinner3c9e6e92010-06-24 22:31:12 +00001025 return converterr(c == 'Z' ? "str or None" : "str",
1026 arg, msgbuf, bufsize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 }
1028 break;
1029 }
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +00001030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001031 case 'e': {/* encoded string */
1032 char **buffer;
1033 const char *encoding;
1034 PyObject *s;
1035 int recode_strings;
1036 Py_ssize_t size;
1037 const char *ptr;
Jeremy Hylton4819e972001-10-11 14:40:37 +00001038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001039 /* Get 'e' parameter: the encoding name */
1040 encoding = (const char *)va_arg(*p_va, const char *);
1041 if (encoding == NULL)
1042 encoding = PyUnicode_GetDefaultEncoding();
Martin v. Löwis423be952008-08-13 15:53:07 +00001043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001044 /* Get output buffer parameter:
1045 's' (recode all objects via Unicode) or
1046 't' (only recode non-string objects)
1047 */
1048 if (*format == 's')
1049 recode_strings = 1;
1050 else if (*format == 't')
1051 recode_strings = 0;
1052 else
1053 return converterr(
1054 "(unknown parser marker combination)",
1055 arg, msgbuf, bufsize);
1056 buffer = (char **)va_arg(*p_va, char **);
1057 format++;
1058 if (buffer == NULL)
1059 return converterr("(buffer is NULL)",
1060 arg, msgbuf, bufsize);
Benjamin Peterson9edd2bd2008-08-27 00:31:37 +00001061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 /* Encode object */
1063 if (!recode_strings &&
1064 (PyBytes_Check(arg) || PyByteArray_Check(arg))) {
1065 s = arg;
1066 Py_INCREF(s);
1067 if (PyObject_AsCharBuffer(s, &ptr, &size) < 0)
1068 return converterr("(AsCharBuffer failed)",
1069 arg, msgbuf, bufsize);
1070 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001071 else if (PyUnicode_Check(arg)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001072 /* Encode object; use default error handling */
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001073 s = PyUnicode_AsEncodedString(arg,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 encoding,
1075 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001076 if (s == NULL)
1077 return converterr("(encoding failed)",
1078 arg, msgbuf, bufsize);
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001079 assert(PyBytes_Check(s));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 size = PyBytes_GET_SIZE(s);
1081 ptr = PyBytes_AS_STRING(s);
1082 if (ptr == NULL)
1083 ptr = "";
1084 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001085 else {
1086 return converterr(
1087 recode_strings ? "str" : "str, bytes or bytearray",
1088 arg, msgbuf, bufsize);
1089 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00001090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 /* Write output; output is guaranteed to be 0-terminated */
1092 if (*format == '#') {
1093 /* Using buffer length parameter '#':
1094
1095 - if *buffer is NULL, a new buffer of the
1096 needed size is allocated and the data
1097 copied into it; *buffer is updated to point
1098 to the new buffer; the caller is
1099 responsible for PyMem_Free()ing it after
1100 usage
1101
1102 - if *buffer is not NULL, the data is
1103 copied to *buffer; *buffer_len has to be
1104 set to the size of the buffer on input;
1105 buffer overflow is signalled with an error;
1106 buffer has to provide enough room for the
1107 encoded string plus the trailing 0-byte
1108
1109 - in both cases, *buffer_len is updated to
1110 the size of the buffer /excluding/ the
1111 trailing 0-byte
1112
1113 */
1114 FETCH_SIZE;
1115
1116 format++;
1117 if (q == NULL && q2 == NULL) {
1118 Py_DECREF(s);
1119 return converterr(
1120 "(buffer_len is NULL)",
1121 arg, msgbuf, bufsize);
1122 }
1123 if (*buffer == NULL) {
1124 *buffer = PyMem_NEW(char, size + 1);
1125 if (*buffer == NULL) {
1126 Py_DECREF(s);
Victor Stinner2872e5b2010-06-06 20:38:02 +00001127 PyErr_NoMemory();
Victor Stinner6ab8e822011-01-04 11:16:49 +00001128 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 }
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -04001130 if (addcleanup(*buffer, freelist, cleanup_ptr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001131 Py_DECREF(s);
1132 return converterr(
1133 "(cleanup problem)",
1134 arg, msgbuf, bufsize);
1135 }
1136 } else {
1137 if (size + 1 > BUFFER_LEN) {
1138 Py_DECREF(s);
Serhiy Storchaka4cd63ef2016-02-08 01:22:47 +02001139 PyErr_Format(PyExc_ValueError,
Serhiy Storchakac4b813d2016-02-08 01:06:11 +02001140 "encoded string too long "
1141 "(%zd, maximum length %zd)",
1142 (Py_ssize_t)size, (Py_ssize_t)(BUFFER_LEN-1));
1143 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 }
1145 }
1146 memcpy(*buffer, ptr, size+1);
1147 STORE_SIZE(size);
1148 } else {
1149 /* Using a 0-terminated buffer:
1150
1151 - the encoded string has to be 0-terminated
1152 for this variant to work; if it is not, an
1153 error raised
1154
1155 - a new buffer of the needed size is
1156 allocated and the data copied into it;
1157 *buffer is updated to point to the new
1158 buffer; the caller is responsible for
1159 PyMem_Free()ing it after usage
1160
1161 */
1162 if ((Py_ssize_t)strlen(ptr) != size) {
1163 Py_DECREF(s);
1164 return converterr(
Serhiy Storchakac4b813d2016-02-08 01:06:11 +02001165 "encoded string without null bytes",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 arg, msgbuf, bufsize);
1167 }
1168 *buffer = PyMem_NEW(char, size + 1);
1169 if (*buffer == NULL) {
1170 Py_DECREF(s);
Victor Stinner2872e5b2010-06-06 20:38:02 +00001171 PyErr_NoMemory();
Victor Stinner6ab8e822011-01-04 11:16:49 +00001172 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001173 }
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -04001174 if (addcleanup(*buffer, freelist, cleanup_ptr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 Py_DECREF(s);
1176 return converterr("(cleanup problem)",
1177 arg, msgbuf, bufsize);
1178 }
1179 memcpy(*buffer, ptr, size+1);
1180 }
1181 Py_DECREF(s);
1182 break;
1183 }
1184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 case 'S': { /* PyBytes object */
1186 PyObject **p = va_arg(*p_va, PyObject **);
1187 if (PyBytes_Check(arg))
1188 *p = arg;
1189 else
1190 return converterr("bytes", arg, msgbuf, bufsize);
1191 break;
1192 }
1193
1194 case 'Y': { /* PyByteArray object */
1195 PyObject **p = va_arg(*p_va, PyObject **);
1196 if (PyByteArray_Check(arg))
1197 *p = arg;
1198 else
Victor Stinner5216e6d2010-06-08 21:45:51 +00001199 return converterr("bytearray", arg, msgbuf, bufsize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 break;
1201 }
1202
1203 case 'U': { /* PyUnicode object */
1204 PyObject **p = va_arg(*p_va, PyObject **);
Victor Stinnera1b0c9f2012-05-29 12:30:29 +02001205 if (PyUnicode_Check(arg)) {
1206 if (PyUnicode_READY(arg) == -1)
1207 RETURN_ERR_OCCURRED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 *p = arg;
Victor Stinnera1b0c9f2012-05-29 12:30:29 +02001209 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 else
1211 return converterr("str", arg, msgbuf, bufsize);
1212 break;
1213 }
1214
1215 case 'O': { /* object */
1216 PyTypeObject *type;
1217 PyObject **p;
1218 if (*format == '!') {
1219 type = va_arg(*p_va, PyTypeObject*);
1220 p = va_arg(*p_va, PyObject **);
1221 format++;
1222 if (PyType_IsSubtype(arg->ob_type, type))
1223 *p = arg;
1224 else
1225 return converterr(type->tp_name, arg, msgbuf, bufsize);
1226
1227 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001228 else if (*format == '&') {
1229 typedef int (*converter)(PyObject *, void *);
1230 converter convert = va_arg(*p_va, converter);
1231 void *addr = va_arg(*p_va, void *);
1232 int res;
1233 format++;
1234 if (! (res = (*convert)(arg, addr)))
1235 return converterr("(unspecified)",
1236 arg, msgbuf, bufsize);
1237 if (res == Py_CLEANUP_SUPPORTED &&
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -04001238 addcleanup(addr, freelist, convert) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 return converterr("(cleanup problem)",
1240 arg, msgbuf, bufsize);
1241 }
1242 else {
1243 p = va_arg(*p_va, PyObject **);
1244 *p = arg;
1245 }
1246 break;
1247 }
1248
1249
Victor Stinner25e8ec42010-06-25 00:02:38 +00001250 case 'w': { /* "w*": memory buffer, read-write access */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 void **p = va_arg(*p_va, void **);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252
Victor Stinner25e8ec42010-06-25 00:02:38 +00001253 if (*format != '*')
1254 return converterr(
Serhiy Storchakac4b813d2016-02-08 01:06:11 +02001255 "(invalid use of 'w' format character)",
Victor Stinner25e8ec42010-06-25 00:02:38 +00001256 arg, msgbuf, bufsize);
1257 format++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258
Victor Stinner25e8ec42010-06-25 00:02:38 +00001259 /* Caller is interested in Py_buffer, and the object
1260 supports it directly. */
1261 if (PyObject_GetBuffer(arg, (Py_buffer*)p, PyBUF_WRITABLE) < 0) {
1262 PyErr_Clear();
R David Murray861470c2014-10-05 11:47:01 -04001263 return converterr("read-write bytes-like object",
1264 arg, msgbuf, bufsize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001265 }
Victor Stinner8182b712010-07-28 00:40:58 +00001266 if (!PyBuffer_IsContiguous((Py_buffer*)p, 'C')) {
1267 PyBuffer_Release((Py_buffer*)p);
1268 return converterr("contiguous buffer", arg, msgbuf, bufsize);
1269 }
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -04001270 if (addcleanup(p, freelist, cleanup_buffer)) {
Victor Stinner25e8ec42010-06-25 00:02:38 +00001271 return converterr(
1272 "(cleanup problem)",
1273 arg, msgbuf, bufsize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 break;
1276 }
1277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 default:
Serhiy Storchakac4b813d2016-02-08 01:06:11 +02001279 return converterr("(impossible<bad format char>)", arg, msgbuf, bufsize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280
1281 }
1282
1283 *p_format = format;
1284 return NULL;
Victor Stinner6ab8e822011-01-04 11:16:49 +00001285
1286#undef FETCH_SIZE
1287#undef STORE_SIZE
1288#undef BUFFER_LEN
1289#undef RETURN_ERR_OCCURRED
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00001290}
Guido van Rossumaa354651996-08-19 19:32:04 +00001291
Martin v. Löwis18e16552006-02-15 17:27:45 +00001292static Py_ssize_t
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001293convertbuffer(PyObject *arg, void **p, const char **errmsg)
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +00001294{
Victor Stinner5cb62392010-06-06 20:27:51 +00001295 PyBufferProcs *pb = Py_TYPE(arg)->tp_as_buffer;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 Py_ssize_t count;
1297 Py_buffer view;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 *errmsg = NULL;
1300 *p = NULL;
Victor Stinner8182b712010-07-28 00:40:58 +00001301 if (pb != NULL && pb->bf_releasebuffer != NULL) {
R David Murray861470c2014-10-05 11:47:01 -04001302 *errmsg = "read-only bytes-like object";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 return -1;
1304 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001305
Victor Stinner8182b712010-07-28 00:40:58 +00001306 if (getbuffer(arg, &view, errmsg) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001307 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 count = view.len;
1309 *p = view.buf;
1310 PyBuffer_Release(&view);
1311 return count;
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +00001312}
Guido van Rossumaa354651996-08-19 19:32:04 +00001313
Martin v. Löwis423be952008-08-13 15:53:07 +00001314static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001315getbuffer(PyObject *arg, Py_buffer *view, const char **errmsg)
Martin v. Löwis423be952008-08-13 15:53:07 +00001316{
Victor Stinner8182b712010-07-28 00:40:58 +00001317 if (PyObject_GetBuffer(arg, view, PyBUF_SIMPLE) != 0) {
R David Murray861470c2014-10-05 11:47:01 -04001318 *errmsg = "bytes-like object";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 return -1;
1320 }
Victor Stinner5cb62392010-06-06 20:27:51 +00001321 if (!PyBuffer_IsContiguous(view, 'C')) {
Victor Stinner21e09482010-06-24 22:57:10 +00001322 PyBuffer_Release(view);
Victor Stinner5cb62392010-06-06 20:27:51 +00001323 *errmsg = "contiguous buffer";
1324 return -1;
1325 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001326 return 0;
Martin v. Löwis423be952008-08-13 15:53:07 +00001327}
1328
Guido van Rossumaa354651996-08-19 19:32:04 +00001329/* Support for keyword arguments donated by
1330 Geoff Philbrick <philbric@delphi.hks.com> */
1331
Tim Petersf8cd3e82001-10-27 04:26:57 +00001332/* Return false (0) for error, else true. */
Fred Drake563dfc22001-10-23 14:41:08 +00001333int
1334PyArg_ParseTupleAndKeywords(PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001335 PyObject *keywords,
1336 const char *format,
1337 char **kwlist, ...)
Guido van Rossumaa354651996-08-19 19:32:04 +00001338{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001339 int retval;
1340 va_list va;
Tim Peters45772cd2001-10-27 03:58:40 +00001341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001342 if ((args == NULL || !PyTuple_Check(args)) ||
1343 (keywords != NULL && !PyDict_Check(keywords)) ||
1344 format == NULL ||
1345 kwlist == NULL)
1346 {
1347 PyErr_BadInternalCall();
1348 return 0;
1349 }
Tim Peters45772cd2001-10-27 03:58:40 +00001350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 va_start(va, kwlist);
1352 retval = vgetargskeywords(args, keywords, format, kwlist, &va, 0);
1353 va_end(va);
1354 return retval;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001355}
1356
1357int
1358_PyArg_ParseTupleAndKeywords_SizeT(PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001359 PyObject *keywords,
1360 const char *format,
1361 char **kwlist, ...)
Martin v. Löwis18e16552006-02-15 17:27:45 +00001362{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001363 int retval;
1364 va_list va;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001366 if ((args == NULL || !PyTuple_Check(args)) ||
1367 (keywords != NULL && !PyDict_Check(keywords)) ||
1368 format == NULL ||
1369 kwlist == NULL)
1370 {
1371 PyErr_BadInternalCall();
1372 return 0;
1373 }
Martin v. Löwis18e16552006-02-15 17:27:45 +00001374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001375 va_start(va, kwlist);
1376 retval = vgetargskeywords(args, keywords, format,
1377 kwlist, &va, FLAG_SIZE_T);
1378 va_end(va);
1379 return retval;
Guido van Rossumaa354651996-08-19 19:32:04 +00001380}
1381
1382
Brett Cannon711e7d92004-07-10 22:20:32 +00001383int
1384PyArg_VaParseTupleAndKeywords(PyObject *args,
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00001385 PyObject *keywords,
Guido van Rossum98297ee2007-11-06 21:34:58 +00001386 const char *format,
Martin v. Löwis15e62742006-02-27 16:46:16 +00001387 char **kwlist, va_list va)
Brett Cannon711e7d92004-07-10 22:20:32 +00001388{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 int retval;
1390 va_list lva;
Brett Cannon711e7d92004-07-10 22:20:32 +00001391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 if ((args == NULL || !PyTuple_Check(args)) ||
1393 (keywords != NULL && !PyDict_Check(keywords)) ||
1394 format == NULL ||
1395 kwlist == NULL)
1396 {
1397 PyErr_BadInternalCall();
1398 return 0;
1399 }
Brett Cannon711e7d92004-07-10 22:20:32 +00001400
Alexander Belopolskyf0f45142010-08-11 17:31:17 +00001401 Py_VA_COPY(lva, va);
Brett Cannon711e7d92004-07-10 22:20:32 +00001402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001403 retval = vgetargskeywords(args, keywords, format, kwlist, &lva, 0);
1404 return retval;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001405}
1406
1407int
1408_PyArg_VaParseTupleAndKeywords_SizeT(PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 PyObject *keywords,
1410 const char *format,
1411 char **kwlist, va_list va)
Martin v. Löwis18e16552006-02-15 17:27:45 +00001412{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001413 int retval;
1414 va_list lva;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001416 if ((args == NULL || !PyTuple_Check(args)) ||
1417 (keywords != NULL && !PyDict_Check(keywords)) ||
1418 format == NULL ||
1419 kwlist == NULL)
1420 {
1421 PyErr_BadInternalCall();
1422 return 0;
1423 }
Martin v. Löwis18e16552006-02-15 17:27:45 +00001424
Alexander Belopolskyf0f45142010-08-11 17:31:17 +00001425 Py_VA_COPY(lva, va);
Martin v. Löwis18e16552006-02-15 17:27:45 +00001426
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001427 retval = vgetargskeywords(args, keywords, format,
1428 kwlist, &lva, FLAG_SIZE_T);
1429 return retval;
Brett Cannon711e7d92004-07-10 22:20:32 +00001430}
1431
Benjamin Petersonfb886362010-04-24 18:21:17 +00001432int
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03001433_PyArg_ParseTupleAndKeywordsFast(PyObject *args, PyObject *keywords,
1434 struct _PyArg_Parser *parser, ...)
1435{
1436 int retval;
1437 va_list va;
1438
1439 if ((args == NULL || !PyTuple_Check(args)) ||
1440 (keywords != NULL && !PyDict_Check(keywords)) ||
1441 parser == NULL)
1442 {
1443 PyErr_BadInternalCall();
1444 return 0;
1445 }
1446
1447 va_start(va, parser);
1448 retval = vgetargskeywordsfast(args, keywords, parser, &va, 0);
1449 va_end(va);
1450 return retval;
1451}
1452
1453int
1454_PyArg_ParseTupleAndKeywordsFast_SizeT(PyObject *args, PyObject *keywords,
1455 struct _PyArg_Parser *parser, ...)
1456{
1457 int retval;
1458 va_list va;
1459
1460 if ((args == NULL || !PyTuple_Check(args)) ||
1461 (keywords != NULL && !PyDict_Check(keywords)) ||
1462 parser == NULL)
1463 {
1464 PyErr_BadInternalCall();
1465 return 0;
1466 }
1467
1468 va_start(va, parser);
1469 retval = vgetargskeywordsfast(args, keywords, parser, &va, FLAG_SIZE_T);
1470 va_end(va);
1471 return retval;
1472}
1473
1474
1475int
1476_PyArg_VaParseTupleAndKeywordsFast(PyObject *args, PyObject *keywords,
1477 struct _PyArg_Parser *parser, va_list va)
1478{
1479 int retval;
1480 va_list lva;
1481
1482 if ((args == NULL || !PyTuple_Check(args)) ||
1483 (keywords != NULL && !PyDict_Check(keywords)) ||
1484 parser == NULL)
1485 {
1486 PyErr_BadInternalCall();
1487 return 0;
1488 }
1489
1490 Py_VA_COPY(lva, va);
1491
1492 retval = vgetargskeywordsfast(args, keywords, parser, &lva, 0);
1493 return retval;
1494}
1495
1496int
1497_PyArg_VaParseTupleAndKeywordsFast_SizeT(PyObject *args, PyObject *keywords,
1498 struct _PyArg_Parser *parser, va_list va)
1499{
1500 int retval;
1501 va_list lva;
1502
1503 if ((args == NULL || !PyTuple_Check(args)) ||
1504 (keywords != NULL && !PyDict_Check(keywords)) ||
1505 parser == NULL)
1506 {
1507 PyErr_BadInternalCall();
1508 return 0;
1509 }
1510
1511 Py_VA_COPY(lva, va);
1512
1513 retval = vgetargskeywordsfast(args, keywords, parser, &lva, FLAG_SIZE_T);
1514 return retval;
1515}
1516
1517int
Benjamin Petersonfb886362010-04-24 18:21:17 +00001518PyArg_ValidateKeywordArguments(PyObject *kwargs)
1519{
Benjamin Petersonf6096542010-11-17 22:33:12 +00001520 if (!PyDict_Check(kwargs)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001521 PyErr_BadInternalCall();
1522 return 0;
1523 }
1524 if (!_PyDict_HasOnlyStringKeys(kwargs)) {
1525 PyErr_SetString(PyExc_TypeError,
1526 "keyword arguments must be strings");
1527 return 0;
1528 }
1529 return 1;
Benjamin Petersonfb886362010-04-24 18:21:17 +00001530}
1531
Christian Heimes380f7f22008-02-28 11:19:05 +00001532#define IS_END_OF_FORMAT(c) (c == '\0' || c == ';' || c == ':')
Brett Cannon711e7d92004-07-10 22:20:32 +00001533
Guido van Rossumaa354651996-08-19 19:32:04 +00001534static int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00001535vgetargskeywords(PyObject *args, PyObject *keywords, const char *format,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001536 char **kwlist, va_list *p_va, int flags)
Guido van Rossumaa354651996-08-19 19:32:04 +00001537{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001538 char msgbuf[512];
1539 int levels[32];
1540 const char *fname, *msg, *custom_msg, *keyword;
1541 int min = INT_MAX;
Larry Hastings83a9f482012-03-20 20:06:16 +00001542 int max = INT_MAX;
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001543 int i, pos, len;
1544 int skip = 0;
Victor Stinner74387f52013-11-18 01:21:12 +01001545 Py_ssize_t nargs, nkeywords;
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -04001546 PyObject *current_arg;
Antoine Pitrou7056cb22013-02-17 01:04:57 +01001547 freelistentry_t static_entries[STATIC_FREELIST_ENTRIES];
Benjamin Peterson40be9e52014-02-11 10:09:27 -05001548 freelist_t freelist;
1549
1550 freelist.entries = static_entries;
1551 freelist.first_available = 0;
1552 freelist.entries_malloced = 0;
Tim Petersf4331c12001-10-27 00:17:34 +00001553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001554 assert(args != NULL && PyTuple_Check(args));
1555 assert(keywords == NULL || PyDict_Check(keywords));
1556 assert(format != NULL);
1557 assert(kwlist != NULL);
1558 assert(p_va != NULL);
Tim Peters45772cd2001-10-27 03:58:40 +00001559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001560 /* grab the function name or custom error msg first (mutually exclusive) */
1561 fname = strchr(format, ':');
1562 if (fname) {
1563 fname++;
1564 custom_msg = NULL;
1565 }
1566 else {
1567 custom_msg = strchr(format,';');
1568 if (custom_msg)
1569 custom_msg++;
1570 }
Christian Heimes380f7f22008-02-28 11:19:05 +00001571
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001572 /* scan kwlist and count the number of positional-only parameters */
1573 for (pos = 0; kwlist[pos] && !*kwlist[pos]; pos++) {
1574 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001575 /* scan kwlist and get greatest possible nbr of args */
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001576 for (len = pos; kwlist[len]; len++) {
1577 if (!*kwlist[len]) {
1578 PyErr_SetString(PyExc_SystemError,
1579 "Empty keyword parameter name");
1580 return cleanreturn(0, &freelist);
1581 }
1582 }
Tim Petersf8cd3e82001-10-27 04:26:57 +00001583
Antoine Pitrou7056cb22013-02-17 01:04:57 +01001584 if (len > STATIC_FREELIST_ENTRIES) {
1585 freelist.entries = PyMem_NEW(freelistentry_t, len);
1586 if (freelist.entries == NULL) {
1587 PyErr_NoMemory();
1588 return 0;
1589 }
1590 freelist.entries_malloced = 1;
Benjamin Peterson7ed67272012-03-16 12:21:02 -05001591 }
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -04001592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001593 nargs = PyTuple_GET_SIZE(args);
1594 nkeywords = (keywords == NULL) ? 0 : PyDict_Size(keywords);
1595 if (nargs + nkeywords > len) {
Victor Stinner6ced7c42011-03-21 18:15:42 +01001596 PyErr_Format(PyExc_TypeError,
Victor Stinnercb29ec52013-11-18 02:05:31 +01001597 "%s%s takes at most %d argument%s (%zd given)",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001598 (fname == NULL) ? "function" : fname,
1599 (fname == NULL) ? "" : "()",
1600 len,
1601 (len == 1) ? "" : "s",
1602 nargs + nkeywords);
Benjamin Peterson01feaec2012-03-16 13:25:58 -05001603 return cleanreturn(0, &freelist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 }
Tim Petersc2f01122001-10-27 07:25:06 +00001605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001606 /* convert tuple args and keyword args in same loop, using kwlist to drive process */
1607 for (i = 0; i < len; i++) {
1608 keyword = kwlist[i];
1609 if (*format == '|') {
Larry Hastings83a9f482012-03-20 20:06:16 +00001610 if (min != INT_MAX) {
Serhiy Storchakaa9725f82016-02-11 12:41:40 +02001611 PyErr_SetString(PyExc_SystemError,
Larry Hastings83a9f482012-03-20 20:06:16 +00001612 "Invalid format string (| specified twice)");
1613 return cleanreturn(0, &freelist);
1614 }
1615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001616 min = i;
1617 format++;
Larry Hastings83a9f482012-03-20 20:06:16 +00001618
1619 if (max != INT_MAX) {
Serhiy Storchakaa9725f82016-02-11 12:41:40 +02001620 PyErr_SetString(PyExc_SystemError,
Larry Hastings83a9f482012-03-20 20:06:16 +00001621 "Invalid format string ($ before |)");
1622 return cleanreturn(0, &freelist);
1623 }
1624 }
1625 if (*format == '$') {
1626 if (max != INT_MAX) {
Serhiy Storchakaa9725f82016-02-11 12:41:40 +02001627 PyErr_SetString(PyExc_SystemError,
Larry Hastings83a9f482012-03-20 20:06:16 +00001628 "Invalid format string ($ specified twice)");
1629 return cleanreturn(0, &freelist);
1630 }
1631
1632 max = i;
1633 format++;
1634
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001635 if (max < pos) {
1636 PyErr_SetString(PyExc_SystemError,
1637 "Empty parameter name after $");
1638 return cleanreturn(0, &freelist);
1639 }
1640 if (skip) {
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03001641 /* Now we know the minimal and the maximal numbers of
1642 * positional arguments and can raise an exception with
1643 * informative message (see below). */
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001644 break;
1645 }
Larry Hastings83a9f482012-03-20 20:06:16 +00001646 if (max < nargs) {
1647 PyErr_Format(PyExc_TypeError,
1648 "Function takes %s %d positional arguments"
1649 " (%d given)",
1650 (min != INT_MAX) ? "at most" : "exactly",
1651 max, nargs);
1652 return cleanreturn(0, &freelist);
1653 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001654 }
1655 if (IS_END_OF_FORMAT(*format)) {
Serhiy Storchakaa9725f82016-02-11 12:41:40 +02001656 PyErr_Format(PyExc_SystemError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001657 "More keyword list entries (%d) than "
1658 "format specifiers (%d)", len, i);
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -04001659 return cleanreturn(0, &freelist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001660 }
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001661 if (!skip) {
1662 current_arg = NULL;
1663 if (nkeywords && i >= pos) {
1664 current_arg = PyDict_GetItemString(keywords, keyword);
1665 if (!current_arg && PyErr_Occurred()) {
1666 return cleanreturn(0, &freelist);
1667 }
1668 }
1669 if (current_arg) {
1670 --nkeywords;
1671 if (i < nargs) {
1672 /* arg present in tuple and in dict */
1673 PyErr_Format(PyExc_TypeError,
1674 "Argument given by name ('%s') "
1675 "and position (%d)",
1676 keyword, i+1);
1677 return cleanreturn(0, &freelist);
1678 }
1679 }
1680 else if (i < nargs)
1681 current_arg = PyTuple_GET_ITEM(args, i);
1682
1683 if (current_arg) {
1684 msg = convertitem(current_arg, &format, p_va, flags,
1685 levels, msgbuf, sizeof(msgbuf), &freelist);
1686 if (msg) {
1687 seterror(i+1, msg, levels, fname, custom_msg);
1688 return cleanreturn(0, &freelist);
1689 }
1690 continue;
1691 }
1692
1693 if (i < min) {
1694 if (i < pos) {
1695 assert (min == INT_MAX);
1696 assert (max == INT_MAX);
1697 skip = 1;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03001698 /* At that moment we still don't know the minimal and
1699 * the maximal numbers of positional arguments. Raising
1700 * an exception is deferred until we encounter | and $
1701 * or the end of the format. */
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001702 }
1703 else {
1704 PyErr_Format(PyExc_TypeError, "Required argument "
1705 "'%s' (pos %d) not found",
1706 keyword, i+1);
1707 return cleanreturn(0, &freelist);
1708 }
1709 }
1710 /* current code reports success when all required args
1711 * fulfilled and no keyword args left, with no further
1712 * validation. XXX Maybe skip this in debug build ?
1713 */
1714 if (!nkeywords && !skip) {
1715 return cleanreturn(1, &freelist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 }
1717 }
Guido van Rossumaa354651996-08-19 19:32:04 +00001718
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 /* We are into optional args, skip thru to any remaining
1720 * keyword args */
1721 msg = skipitem(&format, p_va, flags);
1722 if (msg) {
Serhiy Storchakaa9725f82016-02-11 12:41:40 +02001723 PyErr_Format(PyExc_SystemError, "%s: '%s'", msg,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 format);
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -04001725 return cleanreturn(0, &freelist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 }
1727 }
Tim Petersb054be42001-10-27 05:07:41 +00001728
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001729 if (skip) {
1730 PyErr_Format(PyExc_TypeError,
1731 "Function takes %s %d positional arguments"
1732 " (%d given)",
1733 (Py_MIN(pos, min) < i) ? "at least" : "exactly",
1734 Py_MIN(pos, min), nargs);
1735 return cleanreturn(0, &freelist);
1736 }
1737
Larry Hastings83a9f482012-03-20 20:06:16 +00001738 if (!IS_END_OF_FORMAT(*format) && (*format != '|') && (*format != '$')) {
Serhiy Storchakaa9725f82016-02-11 12:41:40 +02001739 PyErr_Format(PyExc_SystemError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 "more argument specifiers than keyword list entries "
1741 "(remaining format:'%s')", format);
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -04001742 return cleanreturn(0, &freelist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 }
Tim Petersc2f01122001-10-27 07:25:06 +00001744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 /* make sure there are no extraneous keyword arguments */
1746 if (nkeywords > 0) {
1747 PyObject *key, *value;
1748 Py_ssize_t pos = 0;
1749 while (PyDict_Next(keywords, &pos, &key, &value)) {
1750 int match = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751 if (!PyUnicode_Check(key)) {
1752 PyErr_SetString(PyExc_TypeError,
1753 "keywords must be strings");
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -04001754 return cleanreturn(0, &freelist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 }
Antoine Pitrou7056cb22013-02-17 01:04:57 +01001756 for (i = 0; i < len; i++) {
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001757 if (*kwlist[i] && !PyUnicode_CompareWithASCIIString(key, kwlist[i])) {
Antoine Pitrou7056cb22013-02-17 01:04:57 +01001758 match = 1;
1759 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760 }
1761 }
1762 if (!match) {
1763 PyErr_Format(PyExc_TypeError,
Victor Stinner93b55132010-05-19 00:54:06 +00001764 "'%U' is an invalid keyword "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 "argument for this function",
Victor Stinner93b55132010-05-19 00:54:06 +00001766 key);
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -04001767 return cleanreturn(0, &freelist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 }
1769 }
1770 }
1771
Jean-Paul Calderonec961b4a2012-03-16 08:51:42 -04001772 return cleanreturn(1, &freelist);
Guido van Rossumaa354651996-08-19 19:32:04 +00001773}
1774
1775
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03001776/* List of static parsers. */
1777static struct _PyArg_Parser *static_arg_parsers = NULL;
1778
1779static int
1780parser_init(struct _PyArg_Parser *parser)
1781{
1782 const char * const *keywords;
1783 const char *format, *msg;
1784 int i, len, min, max, nkw;
1785 PyObject *kwtuple;
1786
1787 assert(parser->format != NULL);
1788 assert(parser->keywords != NULL);
1789 if (parser->kwtuple != NULL) {
1790 return 1;
1791 }
1792
1793 /* grab the function name or custom error msg first (mutually exclusive) */
1794 parser->fname = strchr(parser->format, ':');
1795 if (parser->fname) {
1796 parser->fname++;
1797 parser->custom_msg = NULL;
1798 }
1799 else {
1800 parser->custom_msg = strchr(parser->format,';');
1801 if (parser->custom_msg)
1802 parser->custom_msg++;
1803 }
1804
1805 keywords = parser->keywords;
1806 /* scan keywords and count the number of positional-only parameters */
1807 for (i = 0; keywords[i] && !*keywords[i]; i++) {
1808 }
1809 parser->pos = i;
1810 /* scan keywords and get greatest possible nbr of args */
1811 for (; keywords[i]; i++) {
1812 if (!*keywords[i]) {
1813 PyErr_SetString(PyExc_SystemError,
1814 "Empty keyword parameter name");
1815 return 0;
1816 }
1817 }
1818 len = i;
1819
1820 min = max = INT_MAX;
1821 format = parser->format;
1822 for (i = 0; i < len; i++) {
1823 if (*format == '|') {
1824 if (min != INT_MAX) {
1825 PyErr_SetString(PyExc_SystemError,
1826 "Invalid format string (| specified twice)");
1827 return 0;
1828 }
1829 if (max != INT_MAX) {
1830 PyErr_SetString(PyExc_SystemError,
1831 "Invalid format string ($ before |)");
1832 return 0;
1833 }
1834 min = i;
1835 format++;
1836 }
1837 if (*format == '$') {
1838 if (max != INT_MAX) {
1839 PyErr_SetString(PyExc_SystemError,
1840 "Invalid format string ($ specified twice)");
1841 return 0;
1842 }
1843 if (i < parser->pos) {
1844 PyErr_SetString(PyExc_SystemError,
1845 "Empty parameter name after $");
1846 return 0;
1847 }
1848 max = i;
1849 format++;
1850 }
1851 if (IS_END_OF_FORMAT(*format)) {
1852 PyErr_Format(PyExc_SystemError,
1853 "More keyword list entries (%d) than "
1854 "format specifiers (%d)", len, i);
1855 return 0;
1856 }
1857
1858 msg = skipitem(&format, NULL, 0);
1859 if (msg) {
1860 PyErr_Format(PyExc_SystemError, "%s: '%s'", msg,
1861 format);
1862 return 0;
1863 }
1864 }
1865 parser->min = Py_MIN(min, len);
1866 parser->max = Py_MIN(max, len);
1867
1868 if (!IS_END_OF_FORMAT(*format) && (*format != '|') && (*format != '$')) {
1869 PyErr_Format(PyExc_SystemError,
1870 "more argument specifiers than keyword list entries "
1871 "(remaining format:'%s')", format);
1872 return 0;
1873 }
1874
1875 nkw = len - parser->pos;
1876 kwtuple = PyTuple_New(nkw);
1877 if (kwtuple == NULL) {
1878 return 0;
1879 }
1880 keywords = parser->keywords + parser->pos;
1881 for (i = 0; i < nkw; i++) {
1882 PyObject *str = PyUnicode_FromString(keywords[i]);
1883 if (str == NULL) {
1884 Py_DECREF(kwtuple);
1885 return 0;
1886 }
1887 PyUnicode_InternInPlace(&str);
1888 PyTuple_SET_ITEM(kwtuple, i, str);
1889 }
1890 parser->kwtuple = kwtuple;
1891
1892 assert(parser->next == NULL);
1893 parser->next = static_arg_parsers;
1894 static_arg_parsers = parser;
1895 return 1;
1896}
1897
1898static void
1899parser_clear(struct _PyArg_Parser *parser)
1900{
1901 Py_CLEAR(parser->kwtuple);
1902}
1903
1904static int
1905vgetargskeywordsfast(PyObject *args, PyObject *keywords,
1906 struct _PyArg_Parser *parser,
1907 va_list *p_va, int flags)
1908{
1909 PyObject *kwtuple;
1910 char msgbuf[512];
1911 int levels[32];
1912 const char *format;
1913 const char *msg;
1914 PyObject *keyword;
1915 int i, pos, len;
1916 Py_ssize_t nargs, nkeywords;
1917 PyObject *current_arg;
1918 freelistentry_t static_entries[STATIC_FREELIST_ENTRIES];
1919 freelist_t freelist;
1920
1921 freelist.entries = static_entries;
1922 freelist.first_available = 0;
1923 freelist.entries_malloced = 0;
1924
1925 assert(args != NULL && PyTuple_Check(args));
1926 assert(keywords == NULL || PyDict_Check(keywords));
1927 assert(parser != NULL);
1928 assert(p_va != NULL);
1929
1930 if (!parser_init(parser)) {
1931 return 0;
1932 }
1933
1934 kwtuple = parser->kwtuple;
1935 pos = parser->pos;
1936 len = pos + PyTuple_GET_SIZE(kwtuple);
1937
1938 if (len > STATIC_FREELIST_ENTRIES) {
1939 freelist.entries = PyMem_NEW(freelistentry_t, len);
1940 if (freelist.entries == NULL) {
1941 PyErr_NoMemory();
1942 return 0;
1943 }
1944 freelist.entries_malloced = 1;
1945 }
1946
1947 nargs = PyTuple_GET_SIZE(args);
1948 nkeywords = (keywords == NULL) ? 0 : PyDict_Size(keywords);
1949 if (nargs + nkeywords > len) {
1950 PyErr_Format(PyExc_TypeError,
1951 "%s%s takes at most %d argument%s (%zd given)",
1952 (parser->fname == NULL) ? "function" : parser->fname,
1953 (parser->fname == NULL) ? "" : "()",
1954 len,
1955 (len == 1) ? "" : "s",
1956 nargs + nkeywords);
1957 return cleanreturn(0, &freelist);
1958 }
1959 if (parser->max < nargs) {
1960 PyErr_Format(PyExc_TypeError,
1961 "Function takes %s %d positional arguments (%d given)",
1962 (parser->min != INT_MAX) ? "at most" : "exactly",
1963 parser->max, nargs);
1964 return cleanreturn(0, &freelist);
1965 }
1966
1967 format = parser->format;
1968 /* convert tuple args and keyword args in same loop, using kwtuple to drive process */
1969 for (i = 0; i < len; i++) {
1970 keyword = (i >= pos) ? PyTuple_GET_ITEM(kwtuple, i - pos) : NULL;
1971 if (*format == '|') {
1972 format++;
1973 }
1974 if (*format == '$') {
1975 format++;
1976 }
1977 assert(!IS_END_OF_FORMAT(*format));
1978
1979 current_arg = NULL;
1980 if (nkeywords && i >= pos) {
1981 current_arg = PyDict_GetItem(keywords, keyword);
1982 if (!current_arg && PyErr_Occurred()) {
1983 return cleanreturn(0, &freelist);
1984 }
1985 }
1986 if (current_arg) {
1987 --nkeywords;
1988 if (i < nargs) {
1989 /* arg present in tuple and in dict */
1990 PyErr_Format(PyExc_TypeError,
1991 "Argument given by name ('%U') "
1992 "and position (%d)",
1993 keyword, i+1);
1994 return cleanreturn(0, &freelist);
1995 }
1996 }
1997 else if (i < nargs)
1998 current_arg = PyTuple_GET_ITEM(args, i);
1999
2000 if (current_arg) {
2001 msg = convertitem(current_arg, &format, p_va, flags,
2002 levels, msgbuf, sizeof(msgbuf), &freelist);
2003 if (msg) {
2004 seterror(i+1, msg, levels, parser->fname, parser->custom_msg);
2005 return cleanreturn(0, &freelist);
2006 }
2007 continue;
2008 }
2009
2010 if (i < parser->min) {
2011 /* Less arguments than required */
2012 if (i < pos) {
2013 PyErr_Format(PyExc_TypeError,
2014 "Function takes %s %d positional arguments"
2015 " (%d given)",
2016 (Py_MIN(pos, parser->min) < parser->max) ? "at least" : "exactly",
2017 Py_MIN(pos, parser->min), nargs);
2018 }
2019 else {
2020 PyErr_Format(PyExc_TypeError, "Required argument "
2021 "'%U' (pos %d) not found",
2022 keyword, i+1);
2023 }
2024 return cleanreturn(0, &freelist);
2025 }
2026 /* current code reports success when all required args
2027 * fulfilled and no keyword args left, with no further
2028 * validation. XXX Maybe skip this in debug build ?
2029 */
2030 if (!nkeywords) {
2031 return cleanreturn(1, &freelist);
2032 }
2033
2034 /* We are into optional args, skip thru to any remaining
2035 * keyword args */
2036 msg = skipitem(&format, p_va, flags);
2037 assert(msg == NULL);
2038 }
2039
2040 assert(IS_END_OF_FORMAT(*format) || (*format == '|') || (*format == '$'));
2041
2042 /* make sure there are no extraneous keyword arguments */
2043 if (nkeywords > 0) {
2044 PyObject *key, *value;
2045 Py_ssize_t pos = 0;
2046 while (PyDict_Next(keywords, &pos, &key, &value)) {
2047 int match;
2048 if (!PyUnicode_Check(key)) {
2049 PyErr_SetString(PyExc_TypeError,
2050 "keywords must be strings");
2051 return cleanreturn(0, &freelist);
2052 }
2053 match = PySequence_Contains(kwtuple, key);
2054 if (match <= 0) {
2055 if (!match) {
2056 PyErr_Format(PyExc_TypeError,
2057 "'%U' is an invalid keyword "
2058 "argument for this function",
2059 key);
2060 }
2061 return cleanreturn(0, &freelist);
2062 }
2063 }
2064 }
2065
2066 return cleanreturn(1, &freelist);
2067}
2068
2069
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02002070static const char *
Martin v. Löwis18e16552006-02-15 17:27:45 +00002071skipitem(const char **p_format, va_list *p_va, int flags)
Guido van Rossumaa354651996-08-19 19:32:04 +00002072{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002073 const char *format = *p_format;
2074 char c = *format++;
Guido van Rossum98297ee2007-11-06 21:34:58 +00002075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002076 switch (c) {
Georg Brandl6dd14612005-09-14 19:29:53 +00002077
Larry Hastingsa3479012012-05-08 23:52:03 -07002078 /*
2079 * codes that take a single data pointer as an argument
2080 * (the type of the pointer is irrelevant)
2081 */
Georg Brandl6dd14612005-09-14 19:29:53 +00002082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002083 case 'b': /* byte -- very short int */
2084 case 'B': /* byte as bitfield */
2085 case 'h': /* short int */
2086 case 'H': /* short int as bitfield */
2087 case 'i': /* int */
2088 case 'I': /* int sized bitfield */
2089 case 'l': /* long int */
2090 case 'k': /* long int sized bitfield */
Guido van Rossum3dbba6e1999-01-25 21:48:56 +00002091#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002092 case 'L': /* PY_LONG_LONG */
2093 case 'K': /* PY_LONG_LONG sized bitfield */
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002094#endif
Larry Hastingsa3479012012-05-08 23:52:03 -07002095 case 'n': /* Py_ssize_t */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002096 case 'f': /* float */
2097 case 'd': /* double */
2098 case 'D': /* complex double */
2099 case 'c': /* char */
2100 case 'C': /* unicode char */
Larry Hastings10ba07a2012-05-07 02:44:50 -07002101 case 'p': /* boolean predicate */
Larry Hastingsa3479012012-05-08 23:52:03 -07002102 case 'S': /* string object */
2103 case 'Y': /* string object */
2104 case 'U': /* unicode string object */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002105 {
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03002106 if (p_va != NULL) {
2107 (void) va_arg(*p_va, void *);
2108 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 break;
2110 }
Martin v. Löwis18e16552006-02-15 17:27:45 +00002111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002112 /* string codes */
Guido van Rossum98297ee2007-11-06 21:34:58 +00002113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002114 case 'e': /* string with encoding */
2115 {
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03002116 if (p_va != NULL) {
2117 (void) va_arg(*p_va, const char *);
2118 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002119 if (!(*format == 's' || *format == 't'))
2120 /* after 'e', only 's' and 't' is allowed */
2121 goto err;
2122 format++;
2123 /* explicit fallthrough to string cases */
2124 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00002125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002126 case 's': /* string */
2127 case 'z': /* string or None */
2128 case 'y': /* bytes */
2129 case 'u': /* unicode string */
Larry Hastingsd9e4a412012-05-08 03:51:18 -07002130 case 'Z': /* unicode string or None */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 case 'w': /* buffer, read-write */
2132 {
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03002133 if (p_va != NULL) {
2134 (void) va_arg(*p_va, char **);
2135 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002136 if (*format == '#') {
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03002137 if (p_va != NULL) {
2138 if (flags & FLAG_SIZE_T)
2139 (void) va_arg(*p_va, Py_ssize_t *);
2140 else
2141 (void) va_arg(*p_va, int *);
2142 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002143 format++;
2144 } else if ((c == 's' || c == 'z' || c == 'y') && *format == '*') {
2145 format++;
2146 }
2147 break;
2148 }
Georg Brandl6dd14612005-09-14 19:29:53 +00002149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002150 case 'O': /* object */
2151 {
2152 if (*format == '!') {
2153 format++;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03002154 if (p_va != NULL) {
2155 (void) va_arg(*p_va, PyTypeObject*);
2156 (void) va_arg(*p_va, PyObject **);
2157 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002158 }
2159 else if (*format == '&') {
2160 typedef int (*converter)(PyObject *, void *);
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03002161 if (p_va != NULL) {
2162 (void) va_arg(*p_va, converter);
2163 (void) va_arg(*p_va, void *);
2164 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002165 format++;
2166 }
2167 else {
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03002168 if (p_va != NULL) {
2169 (void) va_arg(*p_va, PyObject **);
2170 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002171 }
2172 break;
2173 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00002174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002175 case '(': /* bypass tuple, not handled at all previously */
2176 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02002177 const char *msg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002178 for (;;) {
2179 if (*format==')')
2180 break;
2181 if (IS_END_OF_FORMAT(*format))
2182 return "Unmatched left paren in format "
2183 "string";
2184 msg = skipitem(&format, p_va, flags);
2185 if (msg)
2186 return msg;
2187 }
2188 format++;
2189 break;
2190 }
Christian Heimes380f7f22008-02-28 11:19:05 +00002191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002192 case ')':
2193 return "Unmatched right paren in format string";
Christian Heimes380f7f22008-02-28 11:19:05 +00002194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002195 default:
Georg Brandl6dd14612005-09-14 19:29:53 +00002196err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002197 return "impossible<bad format char>";
Guido van Rossum98297ee2007-11-06 21:34:58 +00002198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002199 }
Georg Brandl6dd14612005-09-14 19:29:53 +00002200
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002201 *p_format = format;
2202 return NULL;
Guido van Rossumaa354651996-08-19 19:32:04 +00002203}
Fred Drakee4616e62001-10-23 21:09:29 +00002204
2205
2206int
Martin v. Löwis76246742006-03-01 04:06:10 +00002207PyArg_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, ...)
Fred Drakee4616e62001-10-23 21:09:29 +00002208{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002209 Py_ssize_t i, l;
2210 PyObject **o;
2211 va_list vargs;
Fred Drakee4616e62001-10-23 21:09:29 +00002212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002213 assert(min >= 0);
2214 assert(min <= max);
2215 if (!PyTuple_Check(args)) {
2216 PyErr_SetString(PyExc_SystemError,
2217 "PyArg_UnpackTuple() argument list is not a tuple");
2218 return 0;
2219 }
2220 l = PyTuple_GET_SIZE(args);
2221 if (l < min) {
2222 if (name != NULL)
2223 PyErr_Format(
2224 PyExc_TypeError,
2225 "%s expected %s%zd arguments, got %zd",
2226 name, (min == max ? "" : "at least "), min, l);
2227 else
2228 PyErr_Format(
2229 PyExc_TypeError,
2230 "unpacked tuple should have %s%zd elements,"
2231 " but has %zd",
2232 (min == max ? "" : "at least "), min, l);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002233 return 0;
2234 }
Raymond Hettinger94230232016-03-26 03:02:48 -07002235 if (l == 0)
2236 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002237 if (l > max) {
2238 if (name != NULL)
2239 PyErr_Format(
2240 PyExc_TypeError,
2241 "%s expected %s%zd arguments, got %zd",
2242 name, (min == max ? "" : "at most "), max, l);
2243 else
2244 PyErr_Format(
2245 PyExc_TypeError,
2246 "unpacked tuple should have %s%zd elements,"
2247 " but has %zd",
2248 (min == max ? "" : "at most "), max, l);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002249 return 0;
2250 }
Raymond Hettinger94230232016-03-26 03:02:48 -07002251
2252#ifdef HAVE_STDARG_PROTOTYPES
2253 va_start(vargs, max);
2254#else
2255 va_start(vargs);
2256#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002257 for (i = 0; i < l; i++) {
2258 o = va_arg(vargs, PyObject **);
2259 *o = PyTuple_GET_ITEM(args, i);
2260 }
2261 va_end(vargs);
2262 return 1;
Fred Drakee4616e62001-10-23 21:09:29 +00002263}
Georg Brandl02c42872005-08-26 06:42:30 +00002264
2265
2266/* For type constructors that don't take keyword args
2267 *
Larry Hastingsb7ccb202014-01-18 23:50:21 -08002268 * Sets a TypeError and returns 0 if the args/kwargs is
Thomas Wouters89f507f2006-12-13 04:49:30 +00002269 * not empty, returns 1 otherwise
Georg Brandl02c42872005-08-26 06:42:30 +00002270 */
2271int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00002272_PyArg_NoKeywords(const char *funcname, PyObject *kw)
Georg Brandl02c42872005-08-26 06:42:30 +00002273{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002274 if (kw == NULL)
2275 return 1;
2276 if (!PyDict_CheckExact(kw)) {
2277 PyErr_BadInternalCall();
2278 return 0;
2279 }
2280 if (PyDict_Size(kw) == 0)
2281 return 1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00002282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002283 PyErr_Format(PyExc_TypeError, "%s does not take keyword arguments",
2284 funcname);
2285 return 0;
Georg Brandl02c42872005-08-26 06:42:30 +00002286}
Larry Hastingsb7ccb202014-01-18 23:50:21 -08002287
2288
2289int
2290_PyArg_NoPositional(const char *funcname, PyObject *args)
2291{
2292 if (args == NULL)
2293 return 1;
2294 if (!PyTuple_CheckExact(args)) {
2295 PyErr_BadInternalCall();
2296 return 0;
2297 }
2298 if (PyTuple_GET_SIZE(args) == 0)
2299 return 1;
2300
2301 PyErr_Format(PyExc_TypeError, "%s does not take positional arguments",
2302 funcname);
2303 return 0;
2304}
2305
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03002306void
2307_PyArg_Fini(void)
2308{
2309 struct _PyArg_Parser *tmp, *s = static_arg_parsers;
2310 while (s) {
2311 tmp = s->next;
2312 s->next = NULL;
2313 parser_clear(s);
2314 s = tmp;
2315 }
2316 static_arg_parsers = NULL;
2317}
2318
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002319#ifdef __cplusplus
2320};
2321#endif