Home | History | Annotate | Download | only in Python
      1 
      2 /* New getargs implementation */
      3 
      4 #include "Python.h"
      5 
      6 #include <ctype.h>
      7 #include <float.h>
      8 
      9 
     10 #ifdef __cplusplus
     11 extern "C" {
     12 #endif
     13 int PyArg_Parse(PyObject *, const char *, ...);
     14 int PyArg_ParseTuple(PyObject *, const char *, ...);
     15 int PyArg_VaParse(PyObject *, const char *, va_list);
     16 
     17 int PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
     18                                 const char *, char **, ...);
     19 int PyArg_VaParseTupleAndKeywords(PyObject *, PyObject *,
     20                                 const char *, char **, va_list);
     21 
     22 int _PyArg_ParseTupleAndKeywordsFast(PyObject *, PyObject *,
     23                                             struct _PyArg_Parser *, ...);
     24 int _PyArg_VaParseTupleAndKeywordsFast(PyObject *, PyObject *,
     25                                             struct _PyArg_Parser *, va_list);
     26 
     27 #ifdef HAVE_DECLSPEC_DLL
     28 /* Export functions */
     29 PyAPI_FUNC(int) _PyArg_Parse_SizeT(PyObject *, const char *, ...);
     30 PyAPI_FUNC(int) _PyArg_ParseStack_SizeT(PyObject *const *args, Py_ssize_t nargs,
     31                                         const char *format, ...);
     32 PyAPI_FUNC(int) _PyArg_ParseStackAndKeywords_SizeT(PyObject *const *args, Py_ssize_t nargs,
     33                                         PyObject *kwnames,
     34                                         struct _PyArg_Parser *parser, ...);
     35 PyAPI_FUNC(int) _PyArg_ParseTuple_SizeT(PyObject *, const char *, ...);
     36 PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywords_SizeT(PyObject *, PyObject *,
     37                                                   const char *, char **, ...);
     38 PyAPI_FUNC(PyObject *) _Py_BuildValue_SizeT(const char *, ...);
     39 PyAPI_FUNC(int) _PyArg_VaParse_SizeT(PyObject *, const char *, va_list);
     40 PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *, PyObject *,
     41                                               const char *, char **, va_list);
     42 
     43 PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywordsFast_SizeT(PyObject *, PyObject *,
     44                                             struct _PyArg_Parser *, ...);
     45 PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywordsFast_SizeT(PyObject *, PyObject *,
     46                                             struct _PyArg_Parser *, va_list);
     47 #endif
     48 
     49 #define FLAG_COMPAT 1
     50 #define FLAG_SIZE_T 2
     51 
     52 typedef int (*destr_t)(PyObject *, void *);
     53 
     54 
     55 /* Keep track of "objects" that have been allocated or initialized and
     56    which will need to be deallocated or cleaned up somehow if overall
     57    parsing fails.
     58 */
     59 typedef struct {
     60   void *item;
     61   destr_t destructor;
     62 } freelistentry_t;
     63 
     64 typedef struct {
     65   freelistentry_t *entries;
     66   int first_available;
     67   int entries_malloced;
     68 } freelist_t;
     69 
     70 #define STATIC_FREELIST_ENTRIES 8
     71 
     72 /* Forward */
     73 static int vgetargs1_impl(PyObject *args, PyObject *const *stack, Py_ssize_t nargs,
     74                           const char *format, va_list *p_va, int flags);
     75 static int vgetargs1(PyObject *, const char *, va_list *, int);
     76 static void seterror(Py_ssize_t, const char *, int *, const char *, const char *);
     77 static const char *convertitem(PyObject *, const char **, va_list *, int, int *,
     78                                char *, size_t, freelist_t *);
     79 static const char *converttuple(PyObject *, const char **, va_list *, int,
     80                                 int *, char *, size_t, int, freelist_t *);
     81 static const char *convertsimple(PyObject *, const char **, va_list *, int,
     82                                  char *, size_t, freelist_t *);
     83 static Py_ssize_t convertbuffer(PyObject *, const void **p, const char **);
     84 static int getbuffer(PyObject *, Py_buffer *, const char**);
     85 
     86 static int vgetargskeywords(PyObject *, PyObject *,
     87                             const char *, char **, va_list *, int);
     88 static int vgetargskeywordsfast(PyObject *, PyObject *,
     89                             struct _PyArg_Parser *, va_list *, int);
     90 static int vgetargskeywordsfast_impl(PyObject *const *args, Py_ssize_t nargs,
     91                           PyObject *keywords, PyObject *kwnames,
     92                           struct _PyArg_Parser *parser,
     93                           va_list *p_va, int flags);
     94 static const char *skipitem(const char **, va_list *, int);
     95 
     96 int
     97 PyArg_Parse(PyObject *args, const char *format, ...)
     98 {
     99     int retval;
    100     va_list va;
    101 
    102     va_start(va, format);
    103     retval = vgetargs1(args, format, &va, FLAG_COMPAT);
    104     va_end(va);
    105     return retval;
    106 }
    107 
    108 int
    109 _PyArg_Parse_SizeT(PyObject *args, const char *format, ...)
    110 {
    111     int retval;
    112     va_list va;
    113 
    114     va_start(va, format);
    115     retval = vgetargs1(args, format, &va, FLAG_COMPAT|FLAG_SIZE_T);
    116     va_end(va);
    117     return retval;
    118 }
    119 
    120 
    121 int
    122 PyArg_ParseTuple(PyObject *args, const char *format, ...)
    123 {
    124     int retval;
    125     va_list va;
    126 
    127     va_start(va, format);
    128     retval = vgetargs1(args, format, &va, 0);
    129     va_end(va);
    130     return retval;
    131 }
    132 
    133 int
    134 _PyArg_ParseTuple_SizeT(PyObject *args, const char *format, ...)
    135 {
    136     int retval;
    137     va_list va;
    138 
    139     va_start(va, format);
    140     retval = vgetargs1(args, format, &va, FLAG_SIZE_T);
    141     va_end(va);
    142     return retval;
    143 }
    144 
    145 
    146 int
    147 _PyArg_ParseStack(PyObject *const *args, Py_ssize_t nargs, const char *format, ...)
    148 {
    149     int retval;
    150     va_list va;
    151 
    152     va_start(va, format);
    153     retval = vgetargs1_impl(NULL, args, nargs, format, &va, 0);
    154     va_end(va);
    155     return retval;
    156 }
    157 
    158 int
    159 _PyArg_ParseStack_SizeT(PyObject *const *args, Py_ssize_t nargs, const char *format, ...)
    160 {
    161     int retval;
    162     va_list va;
    163 
    164     va_start(va, format);
    165     retval = vgetargs1_impl(NULL, args, nargs, format, &va, FLAG_SIZE_T);
    166     va_end(va);
    167     return retval;
    168 }
    169 
    170 
    171 int
    172 PyArg_VaParse(PyObject *args, const char *format, va_list va)
    173 {
    174     va_list lva;
    175     int retval;
    176 
    177     va_copy(lva, va);
    178 
    179     retval = vgetargs1(args, format, &lva, 0);
    180     va_end(lva);
    181     return retval;
    182 }
    183 
    184 int
    185 _PyArg_VaParse_SizeT(PyObject *args, const char *format, va_list va)
    186 {
    187     va_list lva;
    188     int retval;
    189 
    190     va_copy(lva, va);
    191 
    192     retval = vgetargs1(args, format, &lva, FLAG_SIZE_T);
    193     va_end(lva);
    194     return retval;
    195 }
    196 
    197 
    198 /* Handle cleanup of allocated memory in case of exception */
    199 
    200 static int
    201 cleanup_ptr(PyObject *self, void *ptr)
    202 {
    203     if (ptr) {
    204         PyMem_FREE(ptr);
    205     }
    206     return 0;
    207 }
    208 
    209 static int
    210 cleanup_buffer(PyObject *self, void *ptr)
    211 {
    212     Py_buffer *buf = (Py_buffer *)ptr;
    213     if (buf) {
    214         PyBuffer_Release(buf);
    215     }
    216     return 0;
    217 }
    218 
    219 static int
    220 addcleanup(void *ptr, freelist_t *freelist, destr_t destructor)
    221 {
    222     int index;
    223 
    224     index = freelist->first_available;
    225     freelist->first_available += 1;
    226 
    227     freelist->entries[index].item = ptr;
    228     freelist->entries[index].destructor = destructor;
    229 
    230     return 0;
    231 }
    232 
    233 static int
    234 cleanreturn(int retval, freelist_t *freelist)
    235 {
    236     int index;
    237 
    238     if (retval == 0) {
    239       /* A failure occurred, therefore execute all of the cleanup
    240          functions.
    241       */
    242       for (index = 0; index < freelist->first_available; ++index) {
    243           freelist->entries[index].destructor(NULL,
    244                                               freelist->entries[index].item);
    245       }
    246     }
    247     if (freelist->entries_malloced)
    248         PyMem_FREE(freelist->entries);
    249     return retval;
    250 }
    251 
    252 
    253 static int
    254 vgetargs1_impl(PyObject *compat_args, PyObject *const *stack, Py_ssize_t nargs, const char *format,
    255                va_list *p_va, int flags)
    256 {
    257     char msgbuf[256];
    258     int levels[32];
    259     const char *fname = NULL;
    260     const char *message = NULL;
    261     int min = -1;
    262     int max = 0;
    263     int level = 0;
    264     int endfmt = 0;
    265     const char *formatsave = format;
    266     Py_ssize_t i;
    267     const char *msg;
    268     int compat = flags & FLAG_COMPAT;
    269     freelistentry_t static_entries[STATIC_FREELIST_ENTRIES];
    270     freelist_t freelist;
    271 
    272     assert(nargs == 0 || stack != NULL);
    273 
    274     freelist.entries = static_entries;
    275     freelist.first_available = 0;
    276     freelist.entries_malloced = 0;
    277 
    278     flags = flags & ~FLAG_COMPAT;
    279 
    280     while (endfmt == 0) {
    281         int c = *format++;
    282         switch (c) {
    283         case '(':
    284             if (level == 0)
    285                 max++;
    286             level++;
    287             if (level >= 30)
    288                 Py_FatalError("too many tuple nesting levels "
    289                               "in argument format string");
    290             break;
    291         case ')':
    292             if (level == 0)
    293                 Py_FatalError("excess ')' in getargs format");
    294             else
    295                 level--;
    296             break;
    297         case '\0':
    298             endfmt = 1;
    299             break;
    300         case ':':
    301             fname = format;
    302             endfmt = 1;
    303             break;
    304         case ';':
    305             message = format;
    306             endfmt = 1;
    307             break;
    308         case '|':
    309             if (level == 0)
    310                 min = max;
    311             break;
    312         default:
    313             if (level == 0) {
    314                 if (Py_ISALPHA(Py_CHARMASK(c)))
    315                     if (c != 'e') /* skip encoded */
    316                         max++;
    317             }
    318             break;
    319         }
    320     }
    321 
    322     if (level != 0)
    323         Py_FatalError(/* '(' */ "missing ')' in getargs format");
    324 
    325     if (min < 0)
    326         min = max;
    327 
    328     format = formatsave;
    329 
    330     if (max > STATIC_FREELIST_ENTRIES) {
    331         freelist.entries = PyMem_NEW(freelistentry_t, max);
    332         if (freelist.entries == NULL) {
    333             PyErr_NoMemory();
    334             return 0;
    335         }
    336         freelist.entries_malloced = 1;
    337     }
    338 
    339     if (compat) {
    340         if (max == 0) {
    341             if (compat_args == NULL)
    342                 return 1;
    343             PyErr_Format(PyExc_TypeError,
    344                          "%.200s%s takes no arguments",
    345                          fname==NULL ? "function" : fname,
    346                          fname==NULL ? "" : "()");
    347             return cleanreturn(0, &freelist);
    348         }
    349         else if (min == 1 && max == 1) {
    350             if (compat_args == NULL) {
    351                 PyErr_Format(PyExc_TypeError,
    352                              "%.200s%s takes at least one argument",
    353                              fname==NULL ? "function" : fname,
    354                              fname==NULL ? "" : "()");
    355                 return cleanreturn(0, &freelist);
    356             }
    357             msg = convertitem(compat_args, &format, p_va, flags, levels,
    358                               msgbuf, sizeof(msgbuf), &freelist);
    359             if (msg == NULL)
    360                 return cleanreturn(1, &freelist);
    361             seterror(levels[0], msg, levels+1, fname, message);
    362             return cleanreturn(0, &freelist);
    363         }
    364         else {
    365             PyErr_SetString(PyExc_SystemError,
    366                 "old style getargs format uses new features");
    367             return cleanreturn(0, &freelist);
    368         }
    369     }
    370 
    371     if (nargs < min || max < nargs) {
    372         if (message == NULL)
    373             PyErr_Format(PyExc_TypeError,
    374                          "%.150s%s takes %s %d argument%s (%ld given)",
    375                          fname==NULL ? "function" : fname,
    376                          fname==NULL ? "" : "()",
    377                          min==max ? "exactly"
    378                          : nargs < min ? "at least" : "at most",
    379                          nargs < min ? min : max,
    380                          (nargs < min ? min : max) == 1 ? "" : "s",
    381                          Py_SAFE_DOWNCAST(nargs, Py_ssize_t, long));
    382         else
    383             PyErr_SetString(PyExc_TypeError, message);
    384         return cleanreturn(0, &freelist);
    385     }
    386 
    387     for (i = 0; i < nargs; i++) {
    388         if (*format == '|')
    389             format++;
    390         msg = convertitem(stack[i], &format, p_va,
    391                           flags, levels, msgbuf,
    392                           sizeof(msgbuf), &freelist);
    393         if (msg) {
    394             seterror(i+1, msg, levels, fname, message);
    395             return cleanreturn(0, &freelist);
    396         }
    397     }
    398 
    399     if (*format != '\0' && !Py_ISALPHA(Py_CHARMASK(*format)) &&
    400         *format != '(' &&
    401         *format != '|' && *format != ':' && *format != ';') {
    402         PyErr_Format(PyExc_SystemError,
    403                      "bad format string: %.200s", formatsave);
    404         return cleanreturn(0, &freelist);
    405     }
    406 
    407     return cleanreturn(1, &freelist);
    408 }
    409 
    410 static int
    411 vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags)
    412 {
    413     PyObject **stack;
    414     Py_ssize_t nargs;
    415 
    416     if (!(flags & FLAG_COMPAT)) {
    417         assert(args != NULL);
    418 
    419         if (!PyTuple_Check(args)) {
    420             PyErr_SetString(PyExc_SystemError,
    421                 "new style getargs format but argument is not a tuple");
    422             return 0;
    423         }
    424 
    425         stack = &PyTuple_GET_ITEM(args, 0);
    426         nargs = PyTuple_GET_SIZE(args);
    427     }
    428     else {
    429         stack = NULL;
    430         nargs = 0;
    431     }
    432 
    433     return vgetargs1_impl(args, stack, nargs, format, p_va, flags);
    434 }
    435 
    436 
    437 static void
    438 seterror(Py_ssize_t iarg, const char *msg, int *levels, const char *fname,
    439          const char *message)
    440 {
    441     char buf[512];
    442     int i;
    443     char *p = buf;
    444 
    445     if (PyErr_Occurred())
    446         return;
    447     else if (message == NULL) {
    448         if (fname != NULL) {
    449             PyOS_snprintf(p, sizeof(buf), "%.200s() ", fname);
    450             p += strlen(p);
    451         }
    452         if (iarg != 0) {
    453             PyOS_snprintf(p, sizeof(buf) - (p - buf),
    454                           "argument %" PY_FORMAT_SIZE_T "d", iarg);
    455             i = 0;
    456             p += strlen(p);
    457             while (i < 32 && levels[i] > 0 && (int)(p-buf) < 220) {
    458                 PyOS_snprintf(p, sizeof(buf) - (p - buf),
    459                               ", item %d", levels[i]-1);
    460                 p += strlen(p);
    461                 i++;
    462             }
    463         }
    464         else {
    465             PyOS_snprintf(p, sizeof(buf) - (p - buf), "argument");
    466             p += strlen(p);
    467         }
    468         PyOS_snprintf(p, sizeof(buf) - (p - buf), " %.256s", msg);
    469         message = buf;
    470     }
    471     if (msg[0] == '(') {
    472         PyErr_SetString(PyExc_SystemError, message);
    473     }
    474     else {
    475         PyErr_SetString(PyExc_TypeError, message);
    476     }
    477 }
    478 
    479 
    480 /* Convert a tuple argument.
    481    On entry, *p_format points to the character _after_ the opening '('.
    482    On successful exit, *p_format points to the closing ')'.
    483    If successful:
    484       *p_format and *p_va are updated,
    485       *levels and *msgbuf are untouched,
    486       and NULL is returned.
    487    If the argument is invalid:
    488       *p_format is unchanged,
    489       *p_va is undefined,
    490       *levels is a 0-terminated list of item numbers,
    491       *msgbuf contains an error message, whose format is:
    492      "must be <typename1>, not <typename2>", where:
    493         <typename1> is the name of the expected type, and
    494         <typename2> is the name of the actual type,
    495       and msgbuf is returned.
    496 */
    497 
    498 static const char *
    499 converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
    500              int *levels, char *msgbuf, size_t bufsize, int toplevel,
    501              freelist_t *freelist)
    502 {
    503     int level = 0;
    504     int n = 0;
    505     const char *format = *p_format;
    506     int i;
    507     Py_ssize_t len;
    508 
    509     for (;;) {
    510         int c = *format++;
    511         if (c == '(') {
    512             if (level == 0)
    513                 n++;
    514             level++;
    515         }
    516         else if (c == ')') {
    517             if (level == 0)
    518                 break;
    519             level--;
    520         }
    521         else if (c == ':' || c == ';' || c == '\0')
    522             break;
    523         else if (level == 0 && Py_ISALPHA(Py_CHARMASK(c)))
    524             n++;
    525     }
    526 
    527     if (!PySequence_Check(arg) || PyBytes_Check(arg)) {
    528         levels[0] = 0;
    529         PyOS_snprintf(msgbuf, bufsize,
    530                       toplevel ? "expected %d arguments, not %.50s" :
    531                       "must be %d-item sequence, not %.50s",
    532                   n,
    533                   arg == Py_None ? "None" : arg->ob_type->tp_name);
    534         return msgbuf;
    535     }
    536 
    537     len = PySequence_Size(arg);
    538     if (len != n) {
    539         levels[0] = 0;
    540         if (toplevel) {
    541             PyOS_snprintf(msgbuf, bufsize,
    542                           "expected %d arguments, not %" PY_FORMAT_SIZE_T "d",
    543                           n, len);
    544         }
    545         else {
    546             PyOS_snprintf(msgbuf, bufsize,
    547                           "must be sequence of length %d, "
    548                           "not %" PY_FORMAT_SIZE_T "d",
    549                           n, len);
    550         }
    551         return msgbuf;
    552     }
    553 
    554     format = *p_format;
    555     for (i = 0; i < n; i++) {
    556         const char *msg;
    557         PyObject *item;
    558         item = PySequence_GetItem(arg, i);
    559         if (item == NULL) {
    560             PyErr_Clear();
    561             levels[0] = i+1;
    562             levels[1] = 0;
    563             strncpy(msgbuf, "is not retrievable", bufsize);
    564             return msgbuf;
    565         }
    566         msg = convertitem(item, &format, p_va, flags, levels+1,
    567                           msgbuf, bufsize, freelist);
    568         /* PySequence_GetItem calls tp->sq_item, which INCREFs */
    569         Py_XDECREF(item);
    570         if (msg != NULL) {
    571             levels[0] = i+1;
    572             return msg;
    573         }
    574     }
    575 
    576     *p_format = format;
    577     return NULL;
    578 }
    579 
    580 
    581 /* Convert a single item. */
    582 
    583 static const char *
    584 convertitem(PyObject *arg, const char **p_format, va_list *p_va, int flags,
    585             int *levels, char *msgbuf, size_t bufsize, freelist_t *freelist)
    586 {
    587     const char *msg;
    588     const char *format = *p_format;
    589 
    590     if (*format == '(' /* ')' */) {
    591         format++;
    592         msg = converttuple(arg, &format, p_va, flags, levels, msgbuf,
    593                            bufsize, 0, freelist);
    594         if (msg == NULL)
    595             format++;
    596     }
    597     else {
    598         msg = convertsimple(arg, &format, p_va, flags,
    599                             msgbuf, bufsize, freelist);
    600         if (msg != NULL)
    601             levels[0] = 0;
    602     }
    603     if (msg == NULL)
    604         *p_format = format;
    605     return msg;
    606 }
    607 
    608 
    609 
    610 /* Format an error message generated by convertsimple(). */
    611 
    612 static const char *
    613 converterr(const char *expected, PyObject *arg, char *msgbuf, size_t bufsize)
    614 {
    615     assert(expected != NULL);
    616     assert(arg != NULL);
    617     if (expected[0] == '(') {
    618         PyOS_snprintf(msgbuf, bufsize,
    619                       "%.100s", expected);
    620     }
    621     else {
    622         PyOS_snprintf(msgbuf, bufsize,
    623                       "must be %.50s, not %.50s", expected,
    624                       arg == Py_None ? "None" : arg->ob_type->tp_name);
    625     }
    626     return msgbuf;
    627 }
    628 
    629 #define CONV_UNICODE "(unicode conversion error)"
    630 
    631 /* Explicitly check for float arguments when integers are expected.
    632    Return 1 for error, 0 if ok. */
    633 static int
    634 float_argument_error(PyObject *arg)
    635 {
    636     if (PyFloat_Check(arg)) {
    637         PyErr_SetString(PyExc_TypeError,
    638                         "integer argument expected, got float" );
    639         return 1;
    640     }
    641     else
    642         return 0;
    643 }
    644 
    645 /* Convert a non-tuple argument.  Return NULL if conversion went OK,
    646    or a string with a message describing the failure.  The message is
    647    formatted as "must be <desired type>, not <actual type>".
    648    When failing, an exception may or may not have been raised.
    649    Don't call if a tuple is expected.
    650 
    651    When you add new format codes, please don't forget poor skipitem() below.
    652 */
    653 
    654 static const char *
    655 convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
    656               char *msgbuf, size_t bufsize, freelist_t *freelist)
    657 {
    658     /* For # codes */
    659 #define FETCH_SIZE      int *q=NULL;Py_ssize_t *q2=NULL;\
    660     if (flags & FLAG_SIZE_T) q2=va_arg(*p_va, Py_ssize_t*); \
    661     else q=va_arg(*p_va, int*);
    662 #define STORE_SIZE(s)   \
    663     if (flags & FLAG_SIZE_T) \
    664         *q2=s; \
    665     else { \
    666         if (INT_MAX < s) { \
    667             PyErr_SetString(PyExc_OverflowError, \
    668                 "size does not fit in an int"); \
    669             return converterr("", arg, msgbuf, bufsize); \
    670         } \
    671         *q = (int)s; \
    672     }
    673 #define BUFFER_LEN      ((flags & FLAG_SIZE_T) ? *q2:*q)
    674 #define RETURN_ERR_OCCURRED return msgbuf
    675 
    676     const char *format = *p_format;
    677     char c = *format++;
    678     const char *sarg;
    679 
    680     switch (c) {
    681 
    682     case 'b': { /* unsigned byte -- very short int */
    683         char *p = va_arg(*p_va, char *);
    684         long ival;
    685         if (float_argument_error(arg))
    686             RETURN_ERR_OCCURRED;
    687         ival = PyLong_AsLong(arg);
    688         if (ival == -1 && PyErr_Occurred())
    689             RETURN_ERR_OCCURRED;
    690         else if (ival < 0) {
    691             PyErr_SetString(PyExc_OverflowError,
    692                             "unsigned byte integer is less than minimum");
    693             RETURN_ERR_OCCURRED;
    694         }
    695         else if (ival > UCHAR_MAX) {
    696             PyErr_SetString(PyExc_OverflowError,
    697                             "unsigned byte integer is greater than maximum");
    698             RETURN_ERR_OCCURRED;
    699         }
    700         else
    701             *p = (unsigned char) ival;
    702         break;
    703     }
    704 
    705     case 'B': {/* byte sized bitfield - both signed and unsigned
    706                   values allowed */
    707         char *p = va_arg(*p_va, char *);
    708         long ival;
    709         if (float_argument_error(arg))
    710             RETURN_ERR_OCCURRED;
    711         ival = PyLong_AsUnsignedLongMask(arg);
    712         if (ival == -1 && PyErr_Occurred())
    713             RETURN_ERR_OCCURRED;
    714         else
    715             *p = (unsigned char) ival;
    716         break;
    717     }
    718 
    719     case 'h': {/* signed short int */
    720         short *p = va_arg(*p_va, short *);
    721         long ival;
    722         if (float_argument_error(arg))
    723             RETURN_ERR_OCCURRED;
    724         ival = PyLong_AsLong(arg);
    725         if (ival == -1 && PyErr_Occurred())
    726             RETURN_ERR_OCCURRED;
    727         else if (ival < SHRT_MIN) {
    728             PyErr_SetString(PyExc_OverflowError,
    729                             "signed short integer is less than minimum");
    730             RETURN_ERR_OCCURRED;
    731         }
    732         else if (ival > SHRT_MAX) {
    733             PyErr_SetString(PyExc_OverflowError,
    734                             "signed short integer is greater than maximum");
    735             RETURN_ERR_OCCURRED;
    736         }
    737         else
    738             *p = (short) ival;
    739         break;
    740     }
    741 
    742     case 'H': { /* short int sized bitfield, both signed and
    743                    unsigned allowed */
    744         unsigned short *p = va_arg(*p_va, unsigned short *);
    745         long ival;
    746         if (float_argument_error(arg))
    747             RETURN_ERR_OCCURRED;
    748         ival = PyLong_AsUnsignedLongMask(arg);
    749         if (ival == -1 && PyErr_Occurred())
    750             RETURN_ERR_OCCURRED;
    751         else
    752             *p = (unsigned short) ival;
    753         break;
    754     }
    755 
    756     case 'i': {/* signed int */
    757         int *p = va_arg(*p_va, int *);
    758         long ival;
    759         if (float_argument_error(arg))
    760             RETURN_ERR_OCCURRED;
    761         ival = PyLong_AsLong(arg);
    762         if (ival == -1 && PyErr_Occurred())
    763             RETURN_ERR_OCCURRED;
    764         else if (ival > INT_MAX) {
    765             PyErr_SetString(PyExc_OverflowError,
    766                             "signed integer is greater than maximum");
    767             RETURN_ERR_OCCURRED;
    768         }
    769         else if (ival < INT_MIN) {
    770             PyErr_SetString(PyExc_OverflowError,
    771                             "signed integer is less than minimum");
    772             RETURN_ERR_OCCURRED;
    773         }
    774         else
    775             *p = ival;
    776         break;
    777     }
    778 
    779     case 'I': { /* int sized bitfield, both signed and
    780                    unsigned allowed */
    781         unsigned int *p = va_arg(*p_va, unsigned int *);
    782         unsigned int ival;
    783         if (float_argument_error(arg))
    784             RETURN_ERR_OCCURRED;
    785         ival = (unsigned int)PyLong_AsUnsignedLongMask(arg);
    786         if (ival == (unsigned int)-1 && PyErr_Occurred())
    787             RETURN_ERR_OCCURRED;
    788         else
    789             *p = ival;
    790         break;
    791     }
    792 
    793     case 'n': /* Py_ssize_t */
    794     {
    795         PyObject *iobj;
    796         Py_ssize_t *p = va_arg(*p_va, Py_ssize_t *);
    797         Py_ssize_t ival = -1;
    798         if (float_argument_error(arg))
    799             RETURN_ERR_OCCURRED;
    800         iobj = PyNumber_Index(arg);
    801         if (iobj != NULL) {
    802             ival = PyLong_AsSsize_t(iobj);
    803             Py_DECREF(iobj);
    804         }
    805         if (ival == -1 && PyErr_Occurred())
    806             RETURN_ERR_OCCURRED;
    807         *p = ival;
    808         break;
    809     }
    810     case 'l': {/* long int */
    811         long *p = va_arg(*p_va, long *);
    812         long ival;
    813         if (float_argument_error(arg))
    814             RETURN_ERR_OCCURRED;
    815         ival = PyLong_AsLong(arg);
    816         if (ival == -1 && PyErr_Occurred())
    817             RETURN_ERR_OCCURRED;
    818         else
    819             *p = ival;
    820         break;
    821     }
    822 
    823     case 'k': { /* long sized bitfield */
    824         unsigned long *p = va_arg(*p_va, unsigned long *);
    825         unsigned long ival;
    826         if (PyLong_Check(arg))
    827             ival = PyLong_AsUnsignedLongMask(arg);
    828         else
    829             return converterr("int", arg, msgbuf, bufsize);
    830         *p = ival;
    831         break;
    832     }
    833 
    834     case 'L': {/* long long */
    835         long long *p = va_arg( *p_va, long long * );
    836         long long ival;
    837         if (float_argument_error(arg))
    838             RETURN_ERR_OCCURRED;
    839         ival = PyLong_AsLongLong(arg);
    840         if (ival == (long long)-1 && PyErr_Occurred())
    841             RETURN_ERR_OCCURRED;
    842         else
    843             *p = ival;
    844         break;
    845     }
    846 
    847     case 'K': { /* long long sized bitfield */
    848         unsigned long long *p = va_arg(*p_va, unsigned long long *);
    849         unsigned long long ival;
    850         if (PyLong_Check(arg))
    851             ival = PyLong_AsUnsignedLongLongMask(arg);
    852         else
    853             return converterr("int", arg, msgbuf, bufsize);
    854         *p = ival;
    855         break;
    856     }
    857 
    858     case 'f': {/* float */
    859         float *p = va_arg(*p_va, float *);
    860         double dval = PyFloat_AsDouble(arg);
    861         if (PyErr_Occurred())
    862             RETURN_ERR_OCCURRED;
    863         else
    864             *p = (float) dval;
    865         break;
    866     }
    867 
    868     case 'd': {/* double */
    869         double *p = va_arg(*p_va, double *);
    870         double dval = PyFloat_AsDouble(arg);
    871         if (PyErr_Occurred())
    872             RETURN_ERR_OCCURRED;
    873         else
    874             *p = dval;
    875         break;
    876     }
    877 
    878     case 'D': {/* complex double */
    879         Py_complex *p = va_arg(*p_va, Py_complex *);
    880         Py_complex cval;
    881         cval = PyComplex_AsCComplex(arg);
    882         if (PyErr_Occurred())
    883             RETURN_ERR_OCCURRED;
    884         else
    885             *p = cval;
    886         break;
    887     }
    888 
    889     case 'c': {/* char */
    890         char *p = va_arg(*p_va, char *);
    891         if (PyBytes_Check(arg) && PyBytes_Size(arg) == 1)
    892             *p = PyBytes_AS_STRING(arg)[0];
    893         else if (PyByteArray_Check(arg) && PyByteArray_Size(arg) == 1)
    894             *p = PyByteArray_AS_STRING(arg)[0];
    895         else
    896             return converterr("a byte string of length 1", arg, msgbuf, bufsize);
    897         break;
    898     }
    899 
    900     case 'C': {/* unicode char */
    901         int *p = va_arg(*p_va, int *);
    902         int kind;
    903         void *data;
    904 
    905         if (!PyUnicode_Check(arg))
    906             return converterr("a unicode character", arg, msgbuf, bufsize);
    907 
    908         if (PyUnicode_READY(arg))
    909             RETURN_ERR_OCCURRED;
    910 
    911         if (PyUnicode_GET_LENGTH(arg) != 1)
    912             return converterr("a unicode character", arg, msgbuf, bufsize);
    913 
    914         kind = PyUnicode_KIND(arg);
    915         data = PyUnicode_DATA(arg);
    916         *p = PyUnicode_READ(kind, data, 0);
    917         break;
    918     }
    919 
    920     case 'p': {/* boolean *p*redicate */
    921         int *p = va_arg(*p_va, int *);
    922         int val = PyObject_IsTrue(arg);
    923         if (val > 0)
    924             *p = 1;
    925         else if (val == 0)
    926             *p = 0;
    927         else
    928             RETURN_ERR_OCCURRED;
    929         break;
    930     }
    931 
    932     /* XXX WAAAAH!  's', 'y', 'z', 'u', 'Z', 'e', 'w' codes all
    933        need to be cleaned up! */
    934 
    935     case 'y': {/* any bytes-like object */
    936         void **p = (void **)va_arg(*p_va, char **);
    937         const char *buf;
    938         Py_ssize_t count;
    939         if (*format == '*') {
    940             if (getbuffer(arg, (Py_buffer*)p, &buf) < 0)
    941                 return converterr(buf, arg, msgbuf, bufsize);
    942             format++;
    943             if (addcleanup(p, freelist, cleanup_buffer)) {
    944                 return converterr(
    945                     "(cleanup problem)",
    946                     arg, msgbuf, bufsize);
    947             }
    948             break;
    949         }
    950         count = convertbuffer(arg, (const void **)p, &buf);
    951         if (count < 0)
    952             return converterr(buf, arg, msgbuf, bufsize);
    953         if (*format == '#') {
    954             FETCH_SIZE;
    955             STORE_SIZE(count);
    956             format++;
    957         } else {
    958             if (strlen(*p) != (size_t)count) {
    959                 PyErr_SetString(PyExc_ValueError, "embedded null byte");
    960                 RETURN_ERR_OCCURRED;
    961             }
    962         }
    963         break;
    964     }
    965 
    966     case 's': /* text string or bytes-like object */
    967     case 'z': /* text string, bytes-like object or None */
    968     {
    969         if (*format == '*') {
    970             /* "s*" or "z*" */
    971             Py_buffer *p = (Py_buffer *)va_arg(*p_va, Py_buffer *);
    972 
    973             if (c == 'z' && arg == Py_None)
    974                 PyBuffer_FillInfo(p, NULL, NULL, 0, 1, 0);
    975             else if (PyUnicode_Check(arg)) {
    976                 Py_ssize_t len;
    977                 sarg = PyUnicode_AsUTF8AndSize(arg, &len);
    978                 if (sarg == NULL)
    979                     return converterr(CONV_UNICODE,
    980                                       arg, msgbuf, bufsize);
    981                 PyBuffer_FillInfo(p, arg, (void *)sarg, len, 1, 0);
    982             }
    983             else { /* any bytes-like object */
    984                 const char *buf;
    985                 if (getbuffer(arg, p, &buf) < 0)
    986                     return converterr(buf, arg, msgbuf, bufsize);
    987             }
    988             if (addcleanup(p, freelist, cleanup_buffer)) {
    989                 return converterr(
    990                     "(cleanup problem)",
    991                     arg, msgbuf, bufsize);
    992             }
    993             format++;
    994         } else if (*format == '#') { /* a string or read-only bytes-like object */
    995             /* "s#" or "z#" */
    996             const void **p = (const void **)va_arg(*p_va, const char **);
    997             FETCH_SIZE;
    998 
    999             if (c == 'z' && arg == Py_None) {
   1000                 *p = NULL;
   1001                 STORE_SIZE(0);
   1002             }
   1003             else if (PyUnicode_Check(arg)) {
   1004                 Py_ssize_t len;
   1005                 sarg = PyUnicode_AsUTF8AndSize(arg, &len);
   1006                 if (sarg == NULL)
   1007                     return converterr(CONV_UNICODE,
   1008                                       arg, msgbuf, bufsize);
   1009                 *p = sarg;
   1010                 STORE_SIZE(len);
   1011             }
   1012             else { /* read-only bytes-like object */
   1013                 /* XXX Really? */
   1014                 const char *buf;
   1015                 Py_ssize_t count = convertbuffer(arg, p, &buf);
   1016                 if (count < 0)
   1017                     return converterr(buf, arg, msgbuf, bufsize);
   1018                 STORE_SIZE(count);
   1019             }
   1020             format++;
   1021         } else {
   1022             /* "s" or "z" */
   1023             const char **p = va_arg(*p_va, const char **);
   1024             Py_ssize_t len;
   1025             sarg = NULL;
   1026 
   1027             if (c == 'z' && arg == Py_None)
   1028                 *p = NULL;
   1029             else if (PyUnicode_Check(arg)) {
   1030                 sarg = PyUnicode_AsUTF8AndSize(arg, &len);
   1031                 if (sarg == NULL)
   1032                     return converterr(CONV_UNICODE,
   1033                                       arg, msgbuf, bufsize);
   1034                 if (strlen(sarg) != (size_t)len) {
   1035                     PyErr_SetString(PyExc_ValueError, "embedded null character");
   1036                     RETURN_ERR_OCCURRED;
   1037                 }
   1038                 *p = sarg;
   1039             }
   1040             else
   1041                 return converterr(c == 'z' ? "str or None" : "str",
   1042                                   arg, msgbuf, bufsize);
   1043         }
   1044         break;
   1045     }
   1046 
   1047     case 'u': /* raw unicode buffer (Py_UNICODE *) */
   1048     case 'Z': /* raw unicode buffer or None */
   1049     {
   1050         Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
   1051 
   1052         if (*format == '#') {
   1053             /* "u#" or "Z#" */
   1054             FETCH_SIZE;
   1055 
   1056             if (c == 'Z' && arg == Py_None) {
   1057                 *p = NULL;
   1058                 STORE_SIZE(0);
   1059             }
   1060             else if (PyUnicode_Check(arg)) {
   1061                 Py_ssize_t len;
   1062                 *p = PyUnicode_AsUnicodeAndSize(arg, &len);
   1063                 if (*p == NULL)
   1064                     RETURN_ERR_OCCURRED;
   1065                 STORE_SIZE(len);
   1066             }
   1067             else
   1068                 return converterr(c == 'Z' ? "str or None" : "str",
   1069                                   arg, msgbuf, bufsize);
   1070             format++;
   1071         } else {
   1072             /* "u" or "Z" */
   1073             if (c == 'Z' && arg == Py_None)
   1074                 *p = NULL;
   1075             else if (PyUnicode_Check(arg)) {
   1076                 Py_ssize_t len;
   1077                 *p = PyUnicode_AsUnicodeAndSize(arg, &len);
   1078                 if (*p == NULL)
   1079                     RETURN_ERR_OCCURRED;
   1080                 if (wcslen(*p) != (size_t)len) {
   1081                     PyErr_SetString(PyExc_ValueError, "embedded null character");
   1082                     RETURN_ERR_OCCURRED;
   1083                 }
   1084             } else
   1085                 return converterr(c == 'Z' ? "str or None" : "str",
   1086                                   arg, msgbuf, bufsize);
   1087         }
   1088         break;
   1089     }
   1090 
   1091     case 'e': {/* encoded string */
   1092         char **buffer;
   1093         const char *encoding;
   1094         PyObject *s;
   1095         int recode_strings;
   1096         Py_ssize_t size;
   1097         const char *ptr;
   1098 
   1099         /* Get 'e' parameter: the encoding name */
   1100         encoding = (const char *)va_arg(*p_va, const char *);
   1101         if (encoding == NULL)
   1102             encoding = PyUnicode_GetDefaultEncoding();
   1103 
   1104         /* Get output buffer parameter:
   1105            's' (recode all objects via Unicode) or
   1106            't' (only recode non-string objects)
   1107         */
   1108         if (*format == 's')
   1109             recode_strings = 1;
   1110         else if (*format == 't')
   1111             recode_strings = 0;
   1112         else
   1113             return converterr(
   1114                 "(unknown parser marker combination)",
   1115                 arg, msgbuf, bufsize);
   1116         buffer = (char **)va_arg(*p_va, char **);
   1117         format++;
   1118         if (buffer == NULL)
   1119             return converterr("(buffer is NULL)",
   1120                               arg, msgbuf, bufsize);
   1121 
   1122         /* Encode object */
   1123         if (!recode_strings &&
   1124             (PyBytes_Check(arg) || PyByteArray_Check(arg))) {
   1125             s = arg;
   1126             Py_INCREF(s);
   1127             if (PyBytes_Check(arg)) {
   1128                 size = PyBytes_GET_SIZE(s);
   1129                 ptr = PyBytes_AS_STRING(s);
   1130             }
   1131             else {
   1132                 size = PyByteArray_GET_SIZE(s);
   1133                 ptr = PyByteArray_AS_STRING(s);
   1134             }
   1135         }
   1136         else if (PyUnicode_Check(arg)) {
   1137             /* Encode object; use default error handling */
   1138             s = PyUnicode_AsEncodedString(arg,
   1139                                           encoding,
   1140                                           NULL);
   1141             if (s == NULL)
   1142                 return converterr("(encoding failed)",
   1143                                   arg, msgbuf, bufsize);
   1144             assert(PyBytes_Check(s));
   1145             size = PyBytes_GET_SIZE(s);
   1146             ptr = PyBytes_AS_STRING(s);
   1147             if (ptr == NULL)
   1148                 ptr = "";
   1149         }
   1150         else {
   1151             return converterr(
   1152                 recode_strings ? "str" : "str, bytes or bytearray",
   1153                 arg, msgbuf, bufsize);
   1154         }
   1155 
   1156         /* Write output; output is guaranteed to be 0-terminated */
   1157         if (*format == '#') {
   1158             /* Using buffer length parameter '#':
   1159 
   1160                - if *buffer is NULL, a new buffer of the
   1161                needed size is allocated and the data
   1162                copied into it; *buffer is updated to point
   1163                to the new buffer; the caller is
   1164                responsible for PyMem_Free()ing it after
   1165                usage
   1166 
   1167                - if *buffer is not NULL, the data is
   1168                copied to *buffer; *buffer_len has to be
   1169                set to the size of the buffer on input;
   1170                buffer overflow is signalled with an error;
   1171                buffer has to provide enough room for the
   1172                encoded string plus the trailing 0-byte
   1173 
   1174                - in both cases, *buffer_len is updated to
   1175                the size of the buffer /excluding/ the
   1176                trailing 0-byte
   1177 
   1178             */
   1179             FETCH_SIZE;
   1180 
   1181             format++;
   1182             if (q == NULL && q2 == NULL) {
   1183                 Py_DECREF(s);
   1184                 return converterr(
   1185                     "(buffer_len is NULL)",
   1186                     arg, msgbuf, bufsize);
   1187             }
   1188             if (*buffer == NULL) {
   1189                 *buffer = PyMem_NEW(char, size + 1);
   1190                 if (*buffer == NULL) {
   1191                     Py_DECREF(s);
   1192                     PyErr_NoMemory();
   1193                     RETURN_ERR_OCCURRED;
   1194                 }
   1195                 if (addcleanup(*buffer, freelist, cleanup_ptr)) {
   1196                     Py_DECREF(s);
   1197                     return converterr(
   1198                         "(cleanup problem)",
   1199                         arg, msgbuf, bufsize);
   1200                 }
   1201             } else {
   1202                 if (size + 1 > BUFFER_LEN) {
   1203                     Py_DECREF(s);
   1204                     PyErr_Format(PyExc_ValueError,
   1205                                  "encoded string too long "
   1206                                  "(%zd, maximum length %zd)",
   1207                                  (Py_ssize_t)size, (Py_ssize_t)(BUFFER_LEN-1));
   1208                     RETURN_ERR_OCCURRED;
   1209                 }
   1210             }
   1211             memcpy(*buffer, ptr, size+1);
   1212             STORE_SIZE(size);
   1213         } else {
   1214             /* Using a 0-terminated buffer:
   1215 
   1216                - the encoded string has to be 0-terminated
   1217                for this variant to work; if it is not, an
   1218                error raised
   1219 
   1220                - a new buffer of the needed size is
   1221                allocated and the data copied into it;
   1222                *buffer is updated to point to the new
   1223                buffer; the caller is responsible for
   1224                PyMem_Free()ing it after usage
   1225 
   1226             */
   1227             if ((Py_ssize_t)strlen(ptr) != size) {
   1228                 Py_DECREF(s);
   1229                 return converterr(
   1230                     "encoded string without null bytes",
   1231                     arg, msgbuf, bufsize);
   1232             }
   1233             *buffer = PyMem_NEW(char, size + 1);
   1234             if (*buffer == NULL) {
   1235                 Py_DECREF(s);
   1236                 PyErr_NoMemory();
   1237                 RETURN_ERR_OCCURRED;
   1238             }
   1239             if (addcleanup(*buffer, freelist, cleanup_ptr)) {
   1240                 Py_DECREF(s);
   1241                 return converterr("(cleanup problem)",
   1242                                 arg, msgbuf, bufsize);
   1243             }
   1244             memcpy(*buffer, ptr, size+1);
   1245         }
   1246         Py_DECREF(s);
   1247         break;
   1248     }
   1249 
   1250     case 'S': { /* PyBytes object */
   1251         PyObject **p = va_arg(*p_va, PyObject **);
   1252         if (PyBytes_Check(arg))
   1253             *p = arg;
   1254         else
   1255             return converterr("bytes", arg, msgbuf, bufsize);
   1256         break;
   1257     }
   1258 
   1259     case 'Y': { /* PyByteArray object */
   1260         PyObject **p = va_arg(*p_va, PyObject **);
   1261         if (PyByteArray_Check(arg))
   1262             *p = arg;
   1263         else
   1264             return converterr("bytearray", arg, msgbuf, bufsize);
   1265         break;
   1266     }
   1267 
   1268     case 'U': { /* PyUnicode object */
   1269         PyObject **p = va_arg(*p_va, PyObject **);
   1270         if (PyUnicode_Check(arg)) {
   1271             if (PyUnicode_READY(arg) == -1)
   1272                 RETURN_ERR_OCCURRED;
   1273             *p = arg;
   1274         }
   1275         else
   1276             return converterr("str", arg, msgbuf, bufsize);
   1277         break;
   1278     }
   1279 
   1280     case 'O': { /* object */
   1281         PyTypeObject *type;
   1282         PyObject **p;
   1283         if (*format == '!') {
   1284             type = va_arg(*p_va, PyTypeObject*);
   1285             p = va_arg(*p_va, PyObject **);
   1286             format++;
   1287             if (PyType_IsSubtype(arg->ob_type, type))
   1288                 *p = arg;
   1289             else
   1290                 return converterr(type->tp_name, arg, msgbuf, bufsize);
   1291 
   1292         }
   1293         else if (*format == '&') {
   1294             typedef int (*converter)(PyObject *, void *);
   1295             converter convert = va_arg(*p_va, converter);
   1296             void *addr = va_arg(*p_va, void *);
   1297             int res;
   1298             format++;
   1299             if (! (res = (*convert)(arg, addr)))
   1300                 return converterr("(unspecified)",
   1301                                   arg, msgbuf, bufsize);
   1302             if (res == Py_CLEANUP_SUPPORTED &&
   1303                 addcleanup(addr, freelist, convert) == -1)
   1304                 return converterr("(cleanup problem)",
   1305                                 arg, msgbuf, bufsize);
   1306         }
   1307         else {
   1308             p = va_arg(*p_va, PyObject **);
   1309             *p = arg;
   1310         }
   1311         break;
   1312     }
   1313 
   1314 
   1315     case 'w': { /* "w*": memory buffer, read-write access */
   1316         void **p = va_arg(*p_va, void **);
   1317 
   1318         if (*format != '*')
   1319             return converterr(
   1320                 "(invalid use of 'w' format character)",
   1321                 arg, msgbuf, bufsize);
   1322         format++;
   1323 
   1324         /* Caller is interested in Py_buffer, and the object
   1325            supports it directly. */
   1326         if (PyObject_GetBuffer(arg, (Py_buffer*)p, PyBUF_WRITABLE) < 0) {
   1327             PyErr_Clear();
   1328             return converterr("read-write bytes-like object",
   1329                               arg, msgbuf, bufsize);
   1330         }
   1331         if (!PyBuffer_IsContiguous((Py_buffer*)p, 'C')) {
   1332             PyBuffer_Release((Py_buffer*)p);
   1333             return converterr("contiguous buffer", arg, msgbuf, bufsize);
   1334         }
   1335         if (addcleanup(p, freelist, cleanup_buffer)) {
   1336             return converterr(
   1337                 "(cleanup problem)",
   1338                 arg, msgbuf, bufsize);
   1339         }
   1340         break;
   1341     }
   1342 
   1343     default:
   1344         return converterr("(impossible<bad format char>)", arg, msgbuf, bufsize);
   1345 
   1346     }
   1347 
   1348     *p_format = format;
   1349     return NULL;
   1350 
   1351 #undef FETCH_SIZE
   1352 #undef STORE_SIZE
   1353 #undef BUFFER_LEN
   1354 #undef RETURN_ERR_OCCURRED
   1355 }
   1356 
   1357 static Py_ssize_t
   1358 convertbuffer(PyObject *arg, const void **p, const char **errmsg)
   1359 {
   1360     PyBufferProcs *pb = Py_TYPE(arg)->tp_as_buffer;
   1361     Py_ssize_t count;
   1362     Py_buffer view;
   1363 
   1364     *errmsg = NULL;
   1365     *p = NULL;
   1366     if (pb != NULL && pb->bf_releasebuffer != NULL) {
   1367         *errmsg = "read-only bytes-like object";
   1368         return -1;
   1369     }
   1370 
   1371     if (getbuffer(arg, &view, errmsg) < 0)
   1372         return -1;
   1373     count = view.len;
   1374     *p = view.buf;
   1375     PyBuffer_Release(&view);
   1376     return count;
   1377 }
   1378 
   1379 static int
   1380 getbuffer(PyObject *arg, Py_buffer *view, const char **errmsg)
   1381 {
   1382     if (PyObject_GetBuffer(arg, view, PyBUF_SIMPLE) != 0) {
   1383         *errmsg = "bytes-like object";
   1384         return -1;
   1385     }
   1386     if (!PyBuffer_IsContiguous(view, 'C')) {
   1387         PyBuffer_Release(view);
   1388         *errmsg = "contiguous buffer";
   1389         return -1;
   1390     }
   1391     return 0;
   1392 }
   1393 
   1394 /* Support for keyword arguments donated by
   1395    Geoff Philbrick <philbric (at) delphi.hks.com> */
   1396 
   1397 /* Return false (0) for error, else true. */
   1398 int
   1399 PyArg_ParseTupleAndKeywords(PyObject *args,
   1400                             PyObject *keywords,
   1401                             const char *format,
   1402                             char **kwlist, ...)
   1403 {
   1404     int retval;
   1405     va_list va;
   1406 
   1407     if ((args == NULL || !PyTuple_Check(args)) ||
   1408         (keywords != NULL && !PyDict_Check(keywords)) ||
   1409         format == NULL ||
   1410         kwlist == NULL)
   1411     {
   1412         PyErr_BadInternalCall();
   1413         return 0;
   1414     }
   1415 
   1416     va_start(va, kwlist);
   1417     retval = vgetargskeywords(args, keywords, format, kwlist, &va, 0);
   1418     va_end(va);
   1419     return retval;
   1420 }
   1421 
   1422 int
   1423 _PyArg_ParseTupleAndKeywords_SizeT(PyObject *args,
   1424                                   PyObject *keywords,
   1425                                   const char *format,
   1426                                   char **kwlist, ...)
   1427 {
   1428     int retval;
   1429     va_list va;
   1430 
   1431     if ((args == NULL || !PyTuple_Check(args)) ||
   1432         (keywords != NULL && !PyDict_Check(keywords)) ||
   1433         format == NULL ||
   1434         kwlist == NULL)
   1435     {
   1436         PyErr_BadInternalCall();
   1437         return 0;
   1438     }
   1439 
   1440     va_start(va, kwlist);
   1441     retval = vgetargskeywords(args, keywords, format,
   1442                               kwlist, &va, FLAG_SIZE_T);
   1443     va_end(va);
   1444     return retval;
   1445 }
   1446 
   1447 
   1448 int
   1449 PyArg_VaParseTupleAndKeywords(PyObject *args,
   1450                               PyObject *keywords,
   1451                               const char *format,
   1452                               char **kwlist, va_list va)
   1453 {
   1454     int retval;
   1455     va_list lva;
   1456 
   1457     if ((args == NULL || !PyTuple_Check(args)) ||
   1458         (keywords != NULL && !PyDict_Check(keywords)) ||
   1459         format == NULL ||
   1460         kwlist == NULL)
   1461     {
   1462         PyErr_BadInternalCall();
   1463         return 0;
   1464     }
   1465 
   1466     va_copy(lva, va);
   1467 
   1468     retval = vgetargskeywords(args, keywords, format, kwlist, &lva, 0);
   1469     va_end(lva);
   1470     return retval;
   1471 }
   1472 
   1473 int
   1474 _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *args,
   1475                                     PyObject *keywords,
   1476                                     const char *format,
   1477                                     char **kwlist, 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         format == NULL ||
   1485         kwlist == NULL)
   1486     {
   1487         PyErr_BadInternalCall();
   1488         return 0;
   1489     }
   1490 
   1491     va_copy(lva, va);
   1492 
   1493     retval = vgetargskeywords(args, keywords, format,
   1494                               kwlist, &lva, FLAG_SIZE_T);
   1495     va_end(lva);
   1496     return retval;
   1497 }
   1498 
   1499 int
   1500 _PyArg_ParseTupleAndKeywordsFast(PyObject *args, PyObject *keywords,
   1501                             struct _PyArg_Parser *parser, ...)
   1502 {
   1503     int retval;
   1504     va_list va;
   1505 
   1506     va_start(va, parser);
   1507     retval = vgetargskeywordsfast(args, keywords, parser, &va, 0);
   1508     va_end(va);
   1509     return retval;
   1510 }
   1511 
   1512 int
   1513 _PyArg_ParseTupleAndKeywordsFast_SizeT(PyObject *args, PyObject *keywords,
   1514                             struct _PyArg_Parser *parser, ...)
   1515 {
   1516     int retval;
   1517     va_list va;
   1518 
   1519     va_start(va, parser);
   1520     retval = vgetargskeywordsfast(args, keywords, parser, &va, FLAG_SIZE_T);
   1521     va_end(va);
   1522     return retval;
   1523 }
   1524 
   1525 int
   1526 _PyArg_ParseStackAndKeywords(PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames,
   1527                   struct _PyArg_Parser *parser, ...)
   1528 {
   1529     int retval;
   1530     va_list va;
   1531 
   1532     va_start(va, parser);
   1533     retval = vgetargskeywordsfast_impl(args, nargs, NULL, kwnames, parser, &va, 0);
   1534     va_end(va);
   1535     return retval;
   1536 }
   1537 
   1538 int
   1539 _PyArg_ParseStackAndKeywords_SizeT(PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames,
   1540                         struct _PyArg_Parser *parser, ...)
   1541 {
   1542     int retval;
   1543     va_list va;
   1544 
   1545     va_start(va, parser);
   1546     retval = vgetargskeywordsfast_impl(args, nargs, NULL, kwnames, parser, &va, FLAG_SIZE_T);
   1547     va_end(va);
   1548     return retval;
   1549 }
   1550 
   1551 
   1552 int
   1553 _PyArg_VaParseTupleAndKeywordsFast(PyObject *args, PyObject *keywords,
   1554                             struct _PyArg_Parser *parser, va_list va)
   1555 {
   1556     int retval;
   1557     va_list lva;
   1558 
   1559     va_copy(lva, va);
   1560 
   1561     retval = vgetargskeywordsfast(args, keywords, parser, &lva, 0);
   1562     va_end(lva);
   1563     return retval;
   1564 }
   1565 
   1566 int
   1567 _PyArg_VaParseTupleAndKeywordsFast_SizeT(PyObject *args, PyObject *keywords,
   1568                             struct _PyArg_Parser *parser, va_list va)
   1569 {
   1570     int retval;
   1571     va_list lva;
   1572 
   1573     va_copy(lva, va);
   1574 
   1575     retval = vgetargskeywordsfast(args, keywords, parser, &lva, FLAG_SIZE_T);
   1576     va_end(lva);
   1577     return retval;
   1578 }
   1579 
   1580 int
   1581 PyArg_ValidateKeywordArguments(PyObject *kwargs)
   1582 {
   1583     if (!PyDict_Check(kwargs)) {
   1584         PyErr_BadInternalCall();
   1585         return 0;
   1586     }
   1587     if (!_PyDict_HasOnlyStringKeys(kwargs)) {
   1588         PyErr_SetString(PyExc_TypeError,
   1589                         "keywords must be strings");
   1590         return 0;
   1591     }
   1592     return 1;
   1593 }
   1594 
   1595 #define IS_END_OF_FORMAT(c) (c == '\0' || c == ';' || c == ':')
   1596 
   1597 static int
   1598 vgetargskeywords(PyObject *args, PyObject *kwargs, const char *format,
   1599                  char **kwlist, va_list *p_va, int flags)
   1600 {
   1601     char msgbuf[512];
   1602     int levels[32];
   1603     const char *fname, *msg, *custom_msg;
   1604     int min = INT_MAX;
   1605     int max = INT_MAX;
   1606     int i, pos, len;
   1607     int skip = 0;
   1608     Py_ssize_t nargs, nkwargs;
   1609     PyObject *current_arg;
   1610     freelistentry_t static_entries[STATIC_FREELIST_ENTRIES];
   1611     freelist_t freelist;
   1612 
   1613     freelist.entries = static_entries;
   1614     freelist.first_available = 0;
   1615     freelist.entries_malloced = 0;
   1616 
   1617     assert(args != NULL && PyTuple_Check(args));
   1618     assert(kwargs == NULL || PyDict_Check(kwargs));
   1619     assert(format != NULL);
   1620     assert(kwlist != NULL);
   1621     assert(p_va != NULL);
   1622 
   1623     /* grab the function name or custom error msg first (mutually exclusive) */
   1624     fname = strchr(format, ':');
   1625     if (fname) {
   1626         fname++;
   1627         custom_msg = NULL;
   1628     }
   1629     else {
   1630         custom_msg = strchr(format,';');
   1631         if (custom_msg)
   1632             custom_msg++;
   1633     }
   1634 
   1635     /* scan kwlist and count the number of positional-only parameters */
   1636     for (pos = 0; kwlist[pos] && !*kwlist[pos]; pos++) {
   1637     }
   1638     /* scan kwlist and get greatest possible nbr of args */
   1639     for (len = pos; kwlist[len]; len++) {
   1640         if (!*kwlist[len]) {
   1641             PyErr_SetString(PyExc_SystemError,
   1642                             "Empty keyword parameter name");
   1643             return cleanreturn(0, &freelist);
   1644         }
   1645     }
   1646 
   1647     if (len > STATIC_FREELIST_ENTRIES) {
   1648         freelist.entries = PyMem_NEW(freelistentry_t, len);
   1649         if (freelist.entries == NULL) {
   1650             PyErr_NoMemory();
   1651             return 0;
   1652         }
   1653         freelist.entries_malloced = 1;
   1654     }
   1655 
   1656     nargs = PyTuple_GET_SIZE(args);
   1657     nkwargs = (kwargs == NULL) ? 0 : PyDict_GET_SIZE(kwargs);
   1658     if (nargs + nkwargs > len) {
   1659         /* Adding "keyword" (when nargs == 0) prevents producing wrong error
   1660            messages in some special cases (see bpo-31229). */
   1661         PyErr_Format(PyExc_TypeError,
   1662                      "%.200s%s takes at most %d %sargument%s (%zd given)",
   1663                      (fname == NULL) ? "function" : fname,
   1664                      (fname == NULL) ? "" : "()",
   1665                      len,
   1666                      (nargs == 0) ? "keyword " : "",
   1667                      (len == 1) ? "" : "s",
   1668                      nargs + nkwargs);
   1669         return cleanreturn(0, &freelist);
   1670     }
   1671 
   1672     /* convert tuple args and keyword args in same loop, using kwlist to drive process */
   1673     for (i = 0; i < len; i++) {
   1674         if (*format == '|') {
   1675             if (min != INT_MAX) {
   1676                 PyErr_SetString(PyExc_SystemError,
   1677                                 "Invalid format string (| specified twice)");
   1678                 return cleanreturn(0, &freelist);
   1679             }
   1680 
   1681             min = i;
   1682             format++;
   1683 
   1684             if (max != INT_MAX) {
   1685                 PyErr_SetString(PyExc_SystemError,
   1686                                 "Invalid format string ($ before |)");
   1687                 return cleanreturn(0, &freelist);
   1688             }
   1689         }
   1690         if (*format == '$') {
   1691             if (max != INT_MAX) {
   1692                 PyErr_SetString(PyExc_SystemError,
   1693                                 "Invalid format string ($ specified twice)");
   1694                 return cleanreturn(0, &freelist);
   1695             }
   1696 
   1697             max = i;
   1698             format++;
   1699 
   1700             if (max < pos) {
   1701                 PyErr_SetString(PyExc_SystemError,
   1702                                 "Empty parameter name after $");
   1703                 return cleanreturn(0, &freelist);
   1704             }
   1705             if (skip) {
   1706                 /* Now we know the minimal and the maximal numbers of
   1707                  * positional arguments and can raise an exception with
   1708                  * informative message (see below). */
   1709                 break;
   1710             }
   1711             if (max < nargs) {
   1712                 if (max == 0) {
   1713                     PyErr_Format(PyExc_TypeError,
   1714                                  "%.200s%s takes no positional arguments",
   1715                                  (fname == NULL) ? "function" : fname,
   1716                                  (fname == NULL) ? "" : "()");
   1717                 }
   1718                 else {
   1719                     PyErr_Format(PyExc_TypeError,
   1720                                  "%.200s%s takes %s %d positional arguments"
   1721                                  " (%d given)",
   1722                                  (fname == NULL) ? "function" : fname,
   1723                                  (fname == NULL) ? "" : "()",
   1724                                  (min != INT_MAX) ? "at most" : "exactly",
   1725                                  max, nargs);
   1726                 }
   1727                 return cleanreturn(0, &freelist);
   1728             }
   1729         }
   1730         if (IS_END_OF_FORMAT(*format)) {
   1731             PyErr_Format(PyExc_SystemError,
   1732                          "More keyword list entries (%d) than "
   1733                          "format specifiers (%d)", len, i);
   1734             return cleanreturn(0, &freelist);
   1735         }
   1736         if (!skip) {
   1737             if (i < nargs) {
   1738                 current_arg = PyTuple_GET_ITEM(args, i);
   1739             }
   1740             else if (nkwargs && i >= pos) {
   1741                 current_arg = PyDict_GetItemString(kwargs, kwlist[i]);
   1742                 if (current_arg)
   1743                     --nkwargs;
   1744             }
   1745             else {
   1746                 current_arg = NULL;
   1747             }
   1748 
   1749             if (current_arg) {
   1750                 msg = convertitem(current_arg, &format, p_va, flags,
   1751                     levels, msgbuf, sizeof(msgbuf), &freelist);
   1752                 if (msg) {
   1753                     seterror(i+1, msg, levels, fname, custom_msg);
   1754                     return cleanreturn(0, &freelist);
   1755                 }
   1756                 continue;
   1757             }
   1758 
   1759             if (i < min) {
   1760                 if (i < pos) {
   1761                     assert (min == INT_MAX);
   1762                     assert (max == INT_MAX);
   1763                     skip = 1;
   1764                     /* At that moment we still don't know the minimal and
   1765                      * the maximal numbers of positional arguments.  Raising
   1766                      * an exception is deferred until we encounter | and $
   1767                      * or the end of the format. */
   1768                 }
   1769                 else {
   1770                     PyErr_Format(PyExc_TypeError,  "%.200s%s missing required "
   1771                                  "argument '%s' (pos %d)",
   1772                                  (fname == NULL) ? "function" : fname,
   1773                                  (fname == NULL) ? "" : "()",
   1774                                  kwlist[i], i+1);
   1775                     return cleanreturn(0, &freelist);
   1776                 }
   1777             }
   1778             /* current code reports success when all required args
   1779              * fulfilled and no keyword args left, with no further
   1780              * validation. XXX Maybe skip this in debug build ?
   1781              */
   1782             if (!nkwargs && !skip) {
   1783                 return cleanreturn(1, &freelist);
   1784             }
   1785         }
   1786 
   1787         /* We are into optional args, skip through to any remaining
   1788          * keyword args */
   1789         msg = skipitem(&format, p_va, flags);
   1790         if (msg) {
   1791             PyErr_Format(PyExc_SystemError, "%s: '%s'", msg,
   1792                          format);
   1793             return cleanreturn(0, &freelist);
   1794         }
   1795     }
   1796 
   1797     if (skip) {
   1798         PyErr_Format(PyExc_TypeError,
   1799                      "%.200s%s takes %s %d positional arguments"
   1800                      " (%d given)",
   1801                      (fname == NULL) ? "function" : fname,
   1802                      (fname == NULL) ? "" : "()",
   1803                      (Py_MIN(pos, min) < i) ? "at least" : "exactly",
   1804                      Py_MIN(pos, min), nargs);
   1805         return cleanreturn(0, &freelist);
   1806     }
   1807 
   1808     if (!IS_END_OF_FORMAT(*format) && (*format != '|') && (*format != '$')) {
   1809         PyErr_Format(PyExc_SystemError,
   1810             "more argument specifiers than keyword list entries "
   1811             "(remaining format:'%s')", format);
   1812         return cleanreturn(0, &freelist);
   1813     }
   1814 
   1815     if (nkwargs > 0) {
   1816         PyObject *key;
   1817         Py_ssize_t j;
   1818         /* make sure there are no arguments given by name and position */
   1819         for (i = pos; i < nargs; i++) {
   1820             current_arg = PyDict_GetItemString(kwargs, kwlist[i]);
   1821             if (current_arg) {
   1822                 /* arg present in tuple and in dict */
   1823                 PyErr_Format(PyExc_TypeError,
   1824                              "argument for %.200s%s given by name ('%s') "
   1825                              "and position (%d)",
   1826                              (fname == NULL) ? "function" : fname,
   1827                              (fname == NULL) ? "" : "()",
   1828                              kwlist[i], i+1);
   1829                 return cleanreturn(0, &freelist);
   1830             }
   1831         }
   1832         /* make sure there are no extraneous keyword arguments */
   1833         j = 0;
   1834         while (PyDict_Next(kwargs, &j, &key, NULL)) {
   1835             int match = 0;
   1836             if (!PyUnicode_Check(key)) {
   1837                 PyErr_SetString(PyExc_TypeError,
   1838                                 "keywords must be strings");
   1839                 return cleanreturn(0, &freelist);
   1840             }
   1841             for (i = pos; i < len; i++) {
   1842                 if (_PyUnicode_EqualToASCIIString(key, kwlist[i])) {
   1843                     match = 1;
   1844                     break;
   1845                 }
   1846             }
   1847             if (!match) {
   1848                 PyErr_Format(PyExc_TypeError,
   1849                              "'%U' is an invalid keyword "
   1850                              "argument for %.200s%s",
   1851                              key,
   1852                              (fname == NULL) ? "this function" : fname,
   1853                              (fname == NULL) ? "" : "()");
   1854                 return cleanreturn(0, &freelist);
   1855             }
   1856         }
   1857     }
   1858 
   1859     return cleanreturn(1, &freelist);
   1860 }
   1861 
   1862 
   1863 /* List of static parsers. */
   1864 static struct _PyArg_Parser *static_arg_parsers = NULL;
   1865 
   1866 static int
   1867 parser_init(struct _PyArg_Parser *parser)
   1868 {
   1869     const char * const *keywords;
   1870     const char *format, *msg;
   1871     int i, len, min, max, nkw;
   1872     PyObject *kwtuple;
   1873 
   1874     assert(parser->format != NULL);
   1875     assert(parser->keywords != NULL);
   1876     if (parser->kwtuple != NULL) {
   1877         return 1;
   1878     }
   1879 
   1880     /* grab the function name or custom error msg first (mutually exclusive) */
   1881     parser->fname = strchr(parser->format, ':');
   1882     if (parser->fname) {
   1883         parser->fname++;
   1884         parser->custom_msg = NULL;
   1885     }
   1886     else {
   1887         parser->custom_msg = strchr(parser->format,';');
   1888         if (parser->custom_msg)
   1889             parser->custom_msg++;
   1890     }
   1891 
   1892     keywords = parser->keywords;
   1893     /* scan keywords and count the number of positional-only parameters */
   1894     for (i = 0; keywords[i] && !*keywords[i]; i++) {
   1895     }
   1896     parser->pos = i;
   1897     /* scan keywords and get greatest possible nbr of args */
   1898     for (; keywords[i]; i++) {
   1899         if (!*keywords[i]) {
   1900             PyErr_SetString(PyExc_SystemError,
   1901                             "Empty keyword parameter name");
   1902             return 0;
   1903         }
   1904     }
   1905     len = i;
   1906 
   1907     min = max = INT_MAX;
   1908     format = parser->format;
   1909     for (i = 0; i < len; i++) {
   1910         if (*format == '|') {
   1911             if (min != INT_MAX) {
   1912                 PyErr_SetString(PyExc_SystemError,
   1913                                 "Invalid format string (| specified twice)");
   1914                 return 0;
   1915             }
   1916             if (max != INT_MAX) {
   1917                 PyErr_SetString(PyExc_SystemError,
   1918                                 "Invalid format string ($ before |)");
   1919                 return 0;
   1920             }
   1921             min = i;
   1922             format++;
   1923         }
   1924         if (*format == '$') {
   1925             if (max != INT_MAX) {
   1926                 PyErr_SetString(PyExc_SystemError,
   1927                                 "Invalid format string ($ specified twice)");
   1928                 return 0;
   1929             }
   1930             if (i < parser->pos) {
   1931                 PyErr_SetString(PyExc_SystemError,
   1932                                 "Empty parameter name after $");
   1933                 return 0;
   1934             }
   1935             max = i;
   1936             format++;
   1937         }
   1938         if (IS_END_OF_FORMAT(*format)) {
   1939             PyErr_Format(PyExc_SystemError,
   1940                          "More keyword list entries (%d) than "
   1941                          "format specifiers (%d)", len, i);
   1942             return 0;
   1943         }
   1944 
   1945         msg = skipitem(&format, NULL, 0);
   1946         if (msg) {
   1947             PyErr_Format(PyExc_SystemError, "%s: '%s'", msg,
   1948                          format);
   1949             return 0;
   1950         }
   1951     }
   1952     parser->min = Py_MIN(min, len);
   1953     parser->max = Py_MIN(max, len);
   1954 
   1955     if (!IS_END_OF_FORMAT(*format) && (*format != '|') && (*format != '$')) {
   1956         PyErr_Format(PyExc_SystemError,
   1957             "more argument specifiers than keyword list entries "
   1958             "(remaining format:'%s')", format);
   1959         return 0;
   1960     }
   1961 
   1962     nkw = len - parser->pos;
   1963     kwtuple = PyTuple_New(nkw);
   1964     if (kwtuple == NULL) {
   1965         return 0;
   1966     }
   1967     keywords = parser->keywords + parser->pos;
   1968     for (i = 0; i < nkw; i++) {
   1969         PyObject *str = PyUnicode_FromString(keywords[i]);
   1970         if (str == NULL) {
   1971             Py_DECREF(kwtuple);
   1972             return 0;
   1973         }
   1974         PyUnicode_InternInPlace(&str);
   1975         PyTuple_SET_ITEM(kwtuple, i, str);
   1976     }
   1977     parser->kwtuple = kwtuple;
   1978 
   1979     assert(parser->next == NULL);
   1980     parser->next = static_arg_parsers;
   1981     static_arg_parsers = parser;
   1982     return 1;
   1983 }
   1984 
   1985 static void
   1986 parser_clear(struct _PyArg_Parser *parser)
   1987 {
   1988     Py_CLEAR(parser->kwtuple);
   1989 }
   1990 
   1991 static PyObject*
   1992 find_keyword(PyObject *kwargs, PyObject *kwnames, PyObject *const *kwstack, PyObject *key)
   1993 {
   1994     Py_ssize_t i, nkwargs;
   1995 
   1996     if (kwargs != NULL) {
   1997         return PyDict_GetItem(kwargs, key);
   1998     }
   1999     nkwargs = PyTuple_GET_SIZE(kwnames);
   2000     for (i=0; i < nkwargs; i++) {
   2001         PyObject *kwname = PyTuple_GET_ITEM(kwnames, i);
   2002 
   2003         /* ptr==ptr should match in most cases since keyword keys
   2004            should be interned strings */
   2005         if (kwname == key) {
   2006             return kwstack[i];
   2007         }
   2008         if (!PyUnicode_Check(kwname)) {
   2009             /* ignore non-string keyword keys:
   2010                an error will be raised below */
   2011             continue;
   2012         }
   2013         if (_PyUnicode_EQ(kwname, key)) {
   2014             return kwstack[i];
   2015         }
   2016     }
   2017     return NULL;
   2018 }
   2019 
   2020 static int
   2021 vgetargskeywordsfast_impl(PyObject *const *args, Py_ssize_t nargs,
   2022                           PyObject *kwargs, PyObject *kwnames,
   2023                           struct _PyArg_Parser *parser,
   2024                           va_list *p_va, int flags)
   2025 {
   2026     PyObject *kwtuple;
   2027     char msgbuf[512];
   2028     int levels[32];
   2029     const char *format;
   2030     const char *msg;
   2031     PyObject *keyword;
   2032     int i, pos, len;
   2033     Py_ssize_t nkwargs;
   2034     PyObject *current_arg;
   2035     freelistentry_t static_entries[STATIC_FREELIST_ENTRIES];
   2036     freelist_t freelist;
   2037     PyObject *const *kwstack = NULL;
   2038 
   2039     freelist.entries = static_entries;
   2040     freelist.first_available = 0;
   2041     freelist.entries_malloced = 0;
   2042 
   2043     assert(kwargs == NULL || PyDict_Check(kwargs));
   2044     assert(kwargs == NULL || kwnames == NULL);
   2045     assert(p_va != NULL);
   2046 
   2047     if (parser == NULL) {
   2048         PyErr_BadInternalCall();
   2049         return 0;
   2050     }
   2051 
   2052     if (kwnames != NULL && !PyTuple_Check(kwnames)) {
   2053         PyErr_BadInternalCall();
   2054         return 0;
   2055     }
   2056 
   2057     if (!parser_init(parser)) {
   2058         return 0;
   2059     }
   2060 
   2061     kwtuple = parser->kwtuple;
   2062     pos = parser->pos;
   2063     len = pos + (int)PyTuple_GET_SIZE(kwtuple);
   2064 
   2065     if (len > STATIC_FREELIST_ENTRIES) {
   2066         freelist.entries = PyMem_NEW(freelistentry_t, len);
   2067         if (freelist.entries == NULL) {
   2068             PyErr_NoMemory();
   2069             return 0;
   2070         }
   2071         freelist.entries_malloced = 1;
   2072     }
   2073 
   2074     if (kwargs != NULL) {
   2075         nkwargs = PyDict_GET_SIZE(kwargs);
   2076     }
   2077     else if (kwnames != NULL) {
   2078         nkwargs = PyTuple_GET_SIZE(kwnames);
   2079         kwstack = args + nargs;
   2080     }
   2081     else {
   2082         nkwargs = 0;
   2083     }
   2084     if (nargs + nkwargs > len) {
   2085         /* Adding "keyword" (when nargs == 0) prevents producing wrong error
   2086            messages in some special cases (see bpo-31229). */
   2087         PyErr_Format(PyExc_TypeError,
   2088                      "%.200s%s takes at most %d %sargument%s (%zd given)",
   2089                      (parser->fname == NULL) ? "function" : parser->fname,
   2090                      (parser->fname == NULL) ? "" : "()",
   2091                      len,
   2092                      (nargs == 0) ? "keyword " : "",
   2093                      (len == 1) ? "" : "s",
   2094                      nargs + nkwargs);
   2095         return cleanreturn(0, &freelist);
   2096     }
   2097     if (parser->max < nargs) {
   2098         if (parser->max == 0) {
   2099             PyErr_Format(PyExc_TypeError,
   2100                          "%.200s%s takes no positional arguments",
   2101                          (parser->fname == NULL) ? "function" : parser->fname,
   2102                          (parser->fname == NULL) ? "" : "()");
   2103         }
   2104         else {
   2105             PyErr_Format(PyExc_TypeError,
   2106                          "%.200s%s takes %s %d positional arguments (%d given)",
   2107                          (parser->fname == NULL) ? "function" : parser->fname,
   2108                          (parser->fname == NULL) ? "" : "()",
   2109                          (parser->min != INT_MAX) ? "at most" : "exactly",
   2110                          parser->max, nargs);
   2111         }
   2112         return cleanreturn(0, &freelist);
   2113     }
   2114 
   2115     format = parser->format;
   2116     /* convert tuple args and keyword args in same loop, using kwtuple to drive process */
   2117     for (i = 0; i < len; i++) {
   2118         if (*format == '|') {
   2119             format++;
   2120         }
   2121         if (*format == '$') {
   2122             format++;
   2123         }
   2124         assert(!IS_END_OF_FORMAT(*format));
   2125 
   2126         if (i < nargs) {
   2127             current_arg = args[i];
   2128         }
   2129         else if (nkwargs && i >= pos) {
   2130             keyword = PyTuple_GET_ITEM(kwtuple, i - pos);
   2131             current_arg = find_keyword(kwargs, kwnames, kwstack, keyword);
   2132             if (current_arg)
   2133                 --nkwargs;
   2134         }
   2135         else {
   2136             current_arg = NULL;
   2137         }
   2138 
   2139         if (current_arg) {
   2140             msg = convertitem(current_arg, &format, p_va, flags,
   2141                 levels, msgbuf, sizeof(msgbuf), &freelist);
   2142             if (msg) {
   2143                 seterror(i+1, msg, levels, parser->fname, parser->custom_msg);
   2144                 return cleanreturn(0, &freelist);
   2145             }
   2146             continue;
   2147         }
   2148 
   2149         if (i < parser->min) {
   2150             /* Less arguments than required */
   2151             if (i < pos) {
   2152                 Py_ssize_t min = Py_MIN(pos, parser->min);
   2153                 PyErr_Format(PyExc_TypeError,
   2154                              "%.200s%s takes %s %d positional arguments"
   2155                              " (%d given)",
   2156                              (parser->fname == NULL) ? "function" : parser->fname,
   2157                              (parser->fname == NULL) ? "" : "()",
   2158                              min < parser->max ? "at least" : "exactly",
   2159                              min, nargs);
   2160             }
   2161             else {
   2162                 keyword = PyTuple_GET_ITEM(kwtuple, i - pos);
   2163                 PyErr_Format(PyExc_TypeError,  "%.200s%s missing required "
   2164                              "argument '%U' (pos %d)",
   2165                              (parser->fname == NULL) ? "function" : parser->fname,
   2166                              (parser->fname == NULL) ? "" : "()",
   2167                              keyword, i+1);
   2168             }
   2169             return cleanreturn(0, &freelist);
   2170         }
   2171         /* current code reports success when all required args
   2172          * fulfilled and no keyword args left, with no further
   2173          * validation. XXX Maybe skip this in debug build ?
   2174          */
   2175         if (!nkwargs) {
   2176             return cleanreturn(1, &freelist);
   2177         }
   2178 
   2179         /* We are into optional args, skip through to any remaining
   2180          * keyword args */
   2181         msg = skipitem(&format, p_va, flags);
   2182         assert(msg == NULL);
   2183     }
   2184 
   2185     assert(IS_END_OF_FORMAT(*format) || (*format == '|') || (*format == '$'));
   2186 
   2187     if (nkwargs > 0) {
   2188         Py_ssize_t j;
   2189         /* make sure there are no arguments given by name and position */
   2190         for (i = pos; i < nargs; i++) {
   2191             keyword = PyTuple_GET_ITEM(kwtuple, i - pos);
   2192             current_arg = find_keyword(kwargs, kwnames, kwstack, keyword);
   2193             if (current_arg) {
   2194                 /* arg present in tuple and in dict */
   2195                 PyErr_Format(PyExc_TypeError,
   2196                              "argument for %.200s%s given by name ('%U') "
   2197                              "and position (%d)",
   2198                              (parser->fname == NULL) ? "function" : parser->fname,
   2199                              (parser->fname == NULL) ? "" : "()",
   2200                              keyword, i+1);
   2201                 return cleanreturn(0, &freelist);
   2202             }
   2203         }
   2204         /* make sure there are no extraneous keyword arguments */
   2205         j = 0;
   2206         while (1) {
   2207             int match;
   2208             if (kwargs != NULL) {
   2209                 if (!PyDict_Next(kwargs, &j, &keyword, NULL))
   2210                     break;
   2211             }
   2212             else {
   2213                 if (j >= PyTuple_GET_SIZE(kwnames))
   2214                     break;
   2215                 keyword = PyTuple_GET_ITEM(kwnames, j);
   2216                 j++;
   2217             }
   2218 
   2219             if (!PyUnicode_Check(keyword)) {
   2220                 PyErr_SetString(PyExc_TypeError,
   2221                                 "keywords must be strings");
   2222                 return cleanreturn(0, &freelist);
   2223             }
   2224             match = PySequence_Contains(kwtuple, keyword);
   2225             if (match <= 0) {
   2226                 if (!match) {
   2227                     PyErr_Format(PyExc_TypeError,
   2228                                  "'%U' is an invalid keyword "
   2229                                  "argument for %.200s%s",
   2230                                  keyword,
   2231                                  (parser->fname == NULL) ? "this function" : parser->fname,
   2232                                  (parser->fname == NULL) ? "" : "()");
   2233                 }
   2234                 return cleanreturn(0, &freelist);
   2235             }
   2236         }
   2237     }
   2238 
   2239     return cleanreturn(1, &freelist);
   2240 }
   2241 
   2242 static int
   2243 vgetargskeywordsfast(PyObject *args, PyObject *keywords,
   2244                      struct _PyArg_Parser *parser, va_list *p_va, int flags)
   2245 {
   2246     PyObject **stack;
   2247     Py_ssize_t nargs;
   2248 
   2249     if (args == NULL
   2250         || !PyTuple_Check(args)
   2251         || (keywords != NULL && !PyDict_Check(keywords)))
   2252     {
   2253         PyErr_BadInternalCall();
   2254         return 0;
   2255     }
   2256 
   2257     stack = &PyTuple_GET_ITEM(args, 0);
   2258     nargs = PyTuple_GET_SIZE(args);
   2259     return vgetargskeywordsfast_impl(stack, nargs, keywords, NULL,
   2260                                      parser, p_va, flags);
   2261 }
   2262 
   2263 
   2264 static const char *
   2265 skipitem(const char **p_format, va_list *p_va, int flags)
   2266 {
   2267     const char *format = *p_format;
   2268     char c = *format++;
   2269 
   2270     switch (c) {
   2271 
   2272     /*
   2273      * codes that take a single data pointer as an argument
   2274      * (the type of the pointer is irrelevant)
   2275      */
   2276 
   2277     case 'b': /* byte -- very short int */
   2278     case 'B': /* byte as bitfield */
   2279     case 'h': /* short int */
   2280     case 'H': /* short int as bitfield */
   2281     case 'i': /* int */
   2282     case 'I': /* int sized bitfield */
   2283     case 'l': /* long int */
   2284     case 'k': /* long int sized bitfield */
   2285     case 'L': /* long long */
   2286     case 'K': /* long long sized bitfield */
   2287     case 'n': /* Py_ssize_t */
   2288     case 'f': /* float */
   2289     case 'd': /* double */
   2290     case 'D': /* complex double */
   2291     case 'c': /* char */
   2292     case 'C': /* unicode char */
   2293     case 'p': /* boolean predicate */
   2294     case 'S': /* string object */
   2295     case 'Y': /* string object */
   2296     case 'U': /* unicode string object */
   2297         {
   2298             if (p_va != NULL) {
   2299                 (void) va_arg(*p_va, void *);
   2300             }
   2301             break;
   2302         }
   2303 
   2304     /* string codes */
   2305 
   2306     case 'e': /* string with encoding */
   2307         {
   2308             if (p_va != NULL) {
   2309                 (void) va_arg(*p_va, const char *);
   2310             }
   2311             if (!(*format == 's' || *format == 't'))
   2312                 /* after 'e', only 's' and 't' is allowed */
   2313                 goto err;
   2314             format++;
   2315         }
   2316         /* fall through */
   2317 
   2318     case 's': /* string */
   2319     case 'z': /* string or None */
   2320     case 'y': /* bytes */
   2321     case 'u': /* unicode string */
   2322     case 'Z': /* unicode string or None */
   2323     case 'w': /* buffer, read-write */
   2324         {
   2325             if (p_va != NULL) {
   2326                 (void) va_arg(*p_va, char **);
   2327             }
   2328             if (*format == '#') {
   2329                 if (p_va != NULL) {
   2330                     if (flags & FLAG_SIZE_T)
   2331                         (void) va_arg(*p_va, Py_ssize_t *);
   2332                     else
   2333                         (void) va_arg(*p_va, int *);
   2334                 }
   2335                 format++;
   2336             } else if ((c == 's' || c == 'z' || c == 'y' || c == 'w')
   2337                        && *format == '*')
   2338             {
   2339                 format++;
   2340             }
   2341             break;
   2342         }
   2343 
   2344     case 'O': /* object */
   2345         {
   2346             if (*format == '!') {
   2347                 format++;
   2348                 if (p_va != NULL) {
   2349                     (void) va_arg(*p_va, PyTypeObject*);
   2350                     (void) va_arg(*p_va, PyObject **);
   2351                 }
   2352             }
   2353             else if (*format == '&') {
   2354                 typedef int (*converter)(PyObject *, void *);
   2355                 if (p_va != NULL) {
   2356                     (void) va_arg(*p_va, converter);
   2357                     (void) va_arg(*p_va, void *);
   2358                 }
   2359                 format++;
   2360             }
   2361             else {
   2362                 if (p_va != NULL) {
   2363                     (void) va_arg(*p_va, PyObject **);
   2364                 }
   2365             }
   2366             break;
   2367         }
   2368 
   2369     case '(':           /* bypass tuple, not handled at all previously */
   2370         {
   2371             const char *msg;
   2372             for (;;) {
   2373                 if (*format==')')
   2374                     break;
   2375                 if (IS_END_OF_FORMAT(*format))
   2376                     return "Unmatched left paren in format "
   2377                            "string";
   2378                 msg = skipitem(&format, p_va, flags);
   2379                 if (msg)
   2380                     return msg;
   2381             }
   2382             format++;
   2383             break;
   2384         }
   2385 
   2386     case ')':
   2387         return "Unmatched right paren in format string";
   2388 
   2389     default:
   2390 err:
   2391         return "impossible<bad format char>";
   2392 
   2393     }
   2394 
   2395     *p_format = format;
   2396     return NULL;
   2397 }
   2398 
   2399 
   2400 static int
   2401 unpack_stack(PyObject *const *args, Py_ssize_t nargs, const char *name,
   2402              Py_ssize_t min, Py_ssize_t max, va_list vargs)
   2403 {
   2404     Py_ssize_t i;
   2405     PyObject **o;
   2406 
   2407     assert(min >= 0);
   2408     assert(min <= max);
   2409 
   2410     if (nargs < min) {
   2411         if (name != NULL)
   2412             PyErr_Format(
   2413                 PyExc_TypeError,
   2414                 "%.200s expected %s%zd arguments, got %zd",
   2415                 name, (min == max ? "" : "at least "), min, nargs);
   2416         else
   2417             PyErr_Format(
   2418                 PyExc_TypeError,
   2419                 "unpacked tuple should have %s%zd elements,"
   2420                 " but has %zd",
   2421                 (min == max ? "" : "at least "), min, nargs);
   2422         return 0;
   2423     }
   2424 
   2425     if (nargs == 0) {
   2426         return 1;
   2427     }
   2428 
   2429     if (nargs > max) {
   2430         if (name != NULL)
   2431             PyErr_Format(
   2432                 PyExc_TypeError,
   2433                 "%.200s expected %s%zd arguments, got %zd",
   2434                 name, (min == max ? "" : "at most "), max, nargs);
   2435         else
   2436             PyErr_Format(
   2437                 PyExc_TypeError,
   2438                 "unpacked tuple should have %s%zd elements,"
   2439                 " but has %zd",
   2440                 (min == max ? "" : "at most "), max, nargs);
   2441         return 0;
   2442     }
   2443 
   2444     for (i = 0; i < nargs; i++) {
   2445         o = va_arg(vargs, PyObject **);
   2446         *o = args[i];
   2447     }
   2448     return 1;
   2449 }
   2450 
   2451 int
   2452 PyArg_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, ...)
   2453 {
   2454     PyObject **stack;
   2455     Py_ssize_t nargs;
   2456     int retval;
   2457     va_list vargs;
   2458 
   2459     if (!PyTuple_Check(args)) {
   2460         PyErr_SetString(PyExc_SystemError,
   2461             "PyArg_UnpackTuple() argument list is not a tuple");
   2462         return 0;
   2463     }
   2464     stack = &PyTuple_GET_ITEM(args, 0);
   2465     nargs = PyTuple_GET_SIZE(args);
   2466 
   2467 #ifdef HAVE_STDARG_PROTOTYPES
   2468     va_start(vargs, max);
   2469 #else
   2470     va_start(vargs);
   2471 #endif
   2472     retval = unpack_stack(stack, nargs, name, min, max, vargs);
   2473     va_end(vargs);
   2474     return retval;
   2475 }
   2476 
   2477 int
   2478 _PyArg_UnpackStack(PyObject *const *args, Py_ssize_t nargs, const char *name,
   2479                    Py_ssize_t min, Py_ssize_t max, ...)
   2480 {
   2481     int retval;
   2482     va_list vargs;
   2483 
   2484 #ifdef HAVE_STDARG_PROTOTYPES
   2485     va_start(vargs, max);
   2486 #else
   2487     va_start(vargs);
   2488 #endif
   2489     retval = unpack_stack(args, nargs, name, min, max, vargs);
   2490     va_end(vargs);
   2491     return retval;
   2492 }
   2493 
   2494 
   2495 #undef _PyArg_NoKeywords
   2496 #undef _PyArg_NoPositional
   2497 
   2498 /* For type constructors that don't take keyword args
   2499  *
   2500  * Sets a TypeError and returns 0 if the args/kwargs is
   2501  * not empty, returns 1 otherwise
   2502  */
   2503 int
   2504 _PyArg_NoKeywords(const char *funcname, PyObject *kwargs)
   2505 {
   2506     if (kwargs == NULL) {
   2507         return 1;
   2508     }
   2509     if (!PyDict_CheckExact(kwargs)) {
   2510         PyErr_BadInternalCall();
   2511         return 0;
   2512     }
   2513     if (PyDict_GET_SIZE(kwargs) == 0) {
   2514         return 1;
   2515     }
   2516 
   2517     PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments",
   2518                     funcname);
   2519     return 0;
   2520 }
   2521 
   2522 
   2523 int
   2524 _PyArg_NoPositional(const char *funcname, PyObject *args)
   2525 {
   2526     if (args == NULL)
   2527         return 1;
   2528     if (!PyTuple_CheckExact(args)) {
   2529         PyErr_BadInternalCall();
   2530         return 0;
   2531     }
   2532     if (PyTuple_GET_SIZE(args) == 0)
   2533         return 1;
   2534 
   2535     PyErr_Format(PyExc_TypeError, "%.200s() takes no positional arguments",
   2536                     funcname);
   2537     return 0;
   2538 }
   2539 
   2540 void
   2541 _PyArg_Fini(void)
   2542 {
   2543     struct _PyArg_Parser *tmp, *s = static_arg_parsers;
   2544     while (s) {
   2545         tmp = s->next;
   2546         s->next = NULL;
   2547         parser_clear(s);
   2548         s = tmp;
   2549     }
   2550     static_arg_parsers = NULL;
   2551 }
   2552 
   2553 #ifdef __cplusplus
   2554 };
   2555 #endif
   2556