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