Mercurial > cpython-lru_cache-weakref
diff Python/getargs.c @ 35552:9b7d117eb4bc legacy-trunk
Complete format code support in getargs.c::skipitem(), which is called when
evaluating keyword arguments.
| author | Georg Brandl <georg@python.org> |
|---|---|
| date | Wed, 14 Sep 2005 19:29:53 +0000 |
| parents | 1fdfd0130e28 |
| children | 9541369b0dca |
line wrap: on
line diff
--- a/Python/getargs.c Wed Sep 14 18:09:42 2005 +0000 +++ b/Python/getargs.c Wed Sep 14 19:29:53 2005 +0000 @@ -453,7 +453,9 @@ or a string with a message describing the failure. The message is formatted as "must be <desired type>, not <actual type>". When failing, an exception may or may not have been raised. - Don't call if a tuple is expected. + Don't call if a tuple is expected. + + When you add new format codes, please don't forget poor skipitem() below. */ static char * @@ -1406,73 +1408,52 @@ char c = *format++; switch (c) { - + + /* simple codes + * The individual types (second arg of va_arg) are irrelevant */ + case 'b': /* byte -- very short int */ case 'B': /* byte as bitfield */ - { - (void) va_arg(*p_va, char *); - break; - } - case 'h': /* short int */ - { - (void) va_arg(*p_va, short *); - break; - } - case 'H': /* short int as bitfield */ + case 'i': /* int */ + case 'I': /* int sized bitfield */ + case 'l': /* long int */ + case 'k': /* long int sized bitfield */ +#ifdef HAVE_LONG_LONG + case 'L': /* PY_LONG_LONG */ + case 'K': /* PY_LONG_LONG sized bitfield */ +#endif + case 'f': /* float */ + case 'd': /* double */ +#ifndef WITHOUT_COMPLEX + case 'D': /* complex double */ +#endif + case 'c': /* char */ { - (void) va_arg(*p_va, unsigned short *); - break; - } - - case 'i': /* int */ - { - (void) va_arg(*p_va, int *); - break; - } - - case 'l': /* long int */ - { - (void) va_arg(*p_va, long *); + (void) va_arg(*p_va, void *); break; } -#ifdef HAVE_LONG_LONG - case 'L': /* PY_LONG_LONG int */ - { - (void) va_arg(*p_va, PY_LONG_LONG *); - break; - } -#endif - - case 'f': /* float */ - { - (void) va_arg(*p_va, float *); - break; - } - - case 'd': /* double */ + /* string codes */ + + case 'e': /* string with encoding */ { - (void) va_arg(*p_va, double *); - break; - } - -#ifndef WITHOUT_COMPLEX - case 'D': /* complex double */ - { - (void) va_arg(*p_va, Py_complex *); - break; - } -#endif /* WITHOUT_COMPLEX */ - - case 'c': /* char */ - { - (void) va_arg(*p_va, char *); - break; + (void) va_arg(*p_va, const char *); + if (!(*format == 's' || *format == 't')) + /* after 'e', only 's' and 't' is allowed */ + goto err; + format++; + /* explicit fallthrough to string cases */ } case 's': /* string */ + case 'z': /* string or None */ +#ifdef Py_USING_UNICODE + case 'u': /* unicode string */ +#endif + case 't': /* buffer, read-only */ + case 'w': /* buffer, read-write */ { (void) va_arg(*p_va, char **); if (*format == '#') { @@ -1481,18 +1462,13 @@ } break; } - - case 'z': /* string */ - { - (void) va_arg(*p_va, char **); - if (*format == '#') { - (void) va_arg(*p_va, int *); - format++; - } - break; - } - + + /* object codes */ + case 'S': /* string object */ +#ifdef Py_USING_UNICODE + case 'U': /* unicode string object */ +#endif { (void) va_arg(*p_va, PyObject **); break; @@ -1528,9 +1504,13 @@ } default: +err: return "impossible<bad format char>"; } + + /* The "(...)" format code for tuples is not handled here because + * it is not allowed with keyword args. */ *p_format = format; return NULL;
