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 #ifdef HAVE_DECLSPEC_DLL 22 /* Export functions */ 23 PyAPI_FUNC(int) _PyArg_Parse_SizeT(PyObject *, char *, ...); 24 PyAPI_FUNC(int) _PyArg_ParseTuple_SizeT(PyObject *, char *, ...); 25 PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywords_SizeT(PyObject *, PyObject *, 26 const char *, char **, ...); 27 PyAPI_FUNC(PyObject *) _Py_BuildValue_SizeT(const char *, ...); 28 PyAPI_FUNC(int) _PyArg_VaParse_SizeT(PyObject *, char *, va_list); 29 PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *, PyObject *, 30 const char *, char **, va_list); 31 #endif 32 33 #define FLAG_COMPAT 1 34 #define FLAG_SIZE_T 2 35 36 37 /* Forward */ 38 static int vgetargs1(PyObject *, const char *, va_list *, int); 39 static void seterror(int, const char *, int *, const char *, const char *); 40 static char *convertitem(PyObject *, const char **, va_list *, int, int *, 41 char *, size_t, PyObject **); 42 static char *converttuple(PyObject *, const char **, va_list *, int, 43 int *, char *, size_t, int, PyObject **); 44 static char *convertsimple(PyObject *, const char **, va_list *, int, char *, 45 size_t, PyObject **); 46 static Py_ssize_t convertbuffer(PyObject *, void **p, char **); 47 static int getbuffer(PyObject *, Py_buffer *, char**); 48 49 static int vgetargskeywords(PyObject *, PyObject *, 50 const char *, char **, va_list *, int); 51 static char *skipitem(const char **, va_list *, int); 52 53 int 54 PyArg_Parse(PyObject *args, const char *format, ...) 55 { 56 int retval; 57 va_list va; 58 59 va_start(va, format); 60 retval = vgetargs1(args, format, &va, FLAG_COMPAT); 61 va_end(va); 62 return retval; 63 } 64 65 int 66 _PyArg_Parse_SizeT(PyObject *args, char *format, ...) 67 { 68 int retval; 69 va_list va; 70 71 va_start(va, format); 72 retval = vgetargs1(args, format, &va, FLAG_COMPAT|FLAG_SIZE_T); 73 va_end(va); 74 return retval; 75 } 76 77 78 int 79 PyArg_ParseTuple(PyObject *args, const char *format, ...) 80 { 81 int retval; 82 va_list va; 83 84 va_start(va, format); 85 retval = vgetargs1(args, format, &va, 0); 86 va_end(va); 87 return retval; 88 } 89 90 int 91 _PyArg_ParseTuple_SizeT(PyObject *args, char *format, ...) 92 { 93 int retval; 94 va_list va; 95 96 va_start(va, format); 97 retval = vgetargs1(args, format, &va, FLAG_SIZE_T); 98 va_end(va); 99 return retval; 100 } 101 102 103 int 104 PyArg_VaParse(PyObject *args, const char *format, va_list va) 105 { 106 va_list lva; 107 108 #ifdef VA_LIST_IS_ARRAY 109 memcpy(lva, va, sizeof(va_list)); 110 #else 111 #ifdef __va_copy 112 __va_copy(lva, va); 113 #else 114 lva = va; 115 #endif 116 #endif 117 118 return vgetargs1(args, format, &lva, 0); 119 } 120 121 int 122 _PyArg_VaParse_SizeT(PyObject *args, char *format, va_list va) 123 { 124 va_list lva; 125 126 #ifdef VA_LIST_IS_ARRAY 127 memcpy(lva, va, sizeof(va_list)); 128 #else 129 #ifdef __va_copy 130 __va_copy(lva, va); 131 #else 132 lva = va; 133 #endif 134 #endif 135 136 return vgetargs1(args, format, &lva, FLAG_SIZE_T); 137 } 138 139 140 /* Handle cleanup of allocated memory in case of exception */ 141 142 #define GETARGS_CAPSULE_NAME_CLEANUP_PTR "getargs.cleanup_ptr" 143 #define GETARGS_CAPSULE_NAME_CLEANUP_BUFFER "getargs.cleanup_buffer" 144 145 static void 146 cleanup_ptr(PyObject *self) 147 { 148 void *ptr = PyCapsule_GetPointer(self, GETARGS_CAPSULE_NAME_CLEANUP_PTR); 149 if (ptr) { 150 PyMem_FREE(ptr); 151 } 152 } 153 154 static void 155 cleanup_buffer(PyObject *self) 156 { 157 Py_buffer *ptr = (Py_buffer *)PyCapsule_GetPointer(self, GETARGS_CAPSULE_NAME_CLEANUP_BUFFER); 158 if (ptr) { 159 PyBuffer_Release(ptr); 160 } 161 } 162 163 static int 164 addcleanup(void *ptr, PyObject **freelist, PyCapsule_Destructor destr) 165 { 166 PyObject *cobj; 167 const char *name; 168 169 if (!*freelist) { 170 *freelist = PyList_New(0); 171 if (!*freelist) { 172 destr(ptr); 173 return -1; 174 } 175 } 176 177 if (destr == cleanup_ptr) { 178 name = GETARGS_CAPSULE_NAME_CLEANUP_PTR; 179 } else if (destr == cleanup_buffer) { 180 name = GETARGS_CAPSULE_NAME_CLEANUP_BUFFER; 181 } else { 182 return -1; 183 } 184 cobj = PyCapsule_New(ptr, name, destr); 185 if (!cobj) { 186 destr(ptr); 187 return -1; 188 } 189 if (PyList_Append(*freelist, cobj)) { 190 Py_DECREF(cobj); 191 return -1; 192 } 193 Py_DECREF(cobj); 194 return 0; 195 } 196 197 static int 198 cleanreturn(int retval, PyObject *freelist) 199 { 200 if (freelist && retval != 0) { 201 /* We were successful, reset the destructors so that they 202 don't get called. */ 203 Py_ssize_t len = PyList_GET_SIZE(freelist), i; 204 for (i = 0; i < len; i++) 205 PyCapsule_SetDestructor(PyList_GET_ITEM(freelist, i), NULL); 206 } 207 Py_XDECREF(freelist); 208 return retval; 209 } 210 211 212 static int 213 vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags) 214 { 215 char msgbuf[256]; 216 int levels[32]; 217 const char *fname = NULL; 218 const char *message = NULL; 219 int min = -1; 220 int max = 0; 221 int level = 0; 222 int endfmt = 0; 223 const char *formatsave = format; 224 Py_ssize_t i, len; 225 char *msg; 226 PyObject *freelist = NULL; 227 int compat = flags & FLAG_COMPAT; 228 229 assert(compat || (args != (PyObject*)NULL)); 230 flags = flags & ~FLAG_COMPAT; 231 232 while (endfmt == 0) { 233 int c = *format++; 234 switch (c) { 235 case '(': 236 if (level == 0) 237 max++; 238 level++; 239 if (level >= 30) 240 Py_FatalError("too many tuple nesting levels " 241 "in argument format string"); 242 break; 243 case ')': 244 if (level == 0) 245 Py_FatalError("excess ')' in getargs format"); 246 else 247 level--; 248 break; 249 case '\0': 250 endfmt = 1; 251 break; 252 case ':': 253 fname = format; 254 endfmt = 1; 255 break; 256 case ';': 257 message = format; 258 endfmt = 1; 259 break; 260 default: 261 if (level == 0) { 262 if (c == 'O') 263 max++; 264 else if (isalpha(Py_CHARMASK(c))) { 265 if (c != 'e') /* skip encoded */ 266 max++; 267 } else if (c == '|') 268 min = max; 269 } 270 break; 271 } 272 } 273 274 if (level != 0) 275 Py_FatalError(/* '(' */ "missing ')' in getargs format"); 276 277 if (min < 0) 278 min = max; 279 280 format = formatsave; 281 282 if (compat) { 283 if (max == 0) { 284 if (args == NULL) 285 return 1; 286 PyOS_snprintf(msgbuf, sizeof(msgbuf), 287 "%.200s%s takes no arguments", 288 fname==NULL ? "function" : fname, 289 fname==NULL ? "" : "()"); 290 PyErr_SetString(PyExc_TypeError, msgbuf); 291 return 0; 292 } 293 else if (min == 1 && max == 1) { 294 if (args == NULL) { 295 PyOS_snprintf(msgbuf, sizeof(msgbuf), 296 "%.200s%s takes at least one argument", 297 fname==NULL ? "function" : fname, 298 fname==NULL ? "" : "()"); 299 PyErr_SetString(PyExc_TypeError, msgbuf); 300 return 0; 301 } 302 msg = convertitem(args, &format, p_va, flags, levels, 303 msgbuf, sizeof(msgbuf), &freelist); 304 if (msg == NULL) 305 return cleanreturn(1, freelist); 306 seterror(levels[0], msg, levels+1, fname, message); 307 return cleanreturn(0, freelist); 308 } 309 else { 310 PyErr_SetString(PyExc_SystemError, 311 "old style getargs format uses new features"); 312 return 0; 313 } 314 } 315 316 if (!PyTuple_Check(args)) { 317 PyErr_SetString(PyExc_SystemError, 318 "new style getargs format but argument is not a tuple"); 319 return 0; 320 } 321 322 len = PyTuple_GET_SIZE(args); 323 324 if (len < min || max < len) { 325 if (message == NULL) { 326 PyOS_snprintf(msgbuf, sizeof(msgbuf), 327 "%.150s%s takes %s %d argument%s " 328 "(%ld given)", 329 fname==NULL ? "function" : fname, 330 fname==NULL ? "" : "()", 331 min==max ? "exactly" 332 : len < min ? "at least" : "at most", 333 len < min ? min : max, 334 (len < min ? min : max) == 1 ? "" : "s", 335 Py_SAFE_DOWNCAST(len, Py_ssize_t, long)); 336 message = msgbuf; 337 } 338 PyErr_SetString(PyExc_TypeError, message); 339 return 0; 340 } 341 342 for (i = 0; i < len; i++) { 343 if (*format == '|') 344 format++; 345 msg = convertitem(PyTuple_GET_ITEM(args, i), &format, p_va, 346 flags, levels, msgbuf, 347 sizeof(msgbuf), &freelist); 348 if (msg) { 349 seterror(i+1, msg, levels, fname, msg); 350 return cleanreturn(0, freelist); 351 } 352 } 353 354 if (*format != '\0' && !isalpha(Py_CHARMASK(*format)) && 355 *format != '(' && 356 *format != '|' && *format != ':' && *format != ';') { 357 PyErr_Format(PyExc_SystemError, 358 "bad format string: %.200s", formatsave); 359 return cleanreturn(0, freelist); 360 } 361 362 return cleanreturn(1, freelist); 363 } 364 365 366 367 static void 368 seterror(int iarg, const char *msg, int *levels, const char *fname, 369 const char *message) 370 { 371 char buf[512]; 372 int i; 373 char *p = buf; 374 375 if (PyErr_Occurred()) 376 return; 377 else if (message == NULL) { 378 if (fname != NULL) { 379 PyOS_snprintf(p, sizeof(buf), "%.200s() ", fname); 380 p += strlen(p); 381 } 382 if (iarg != 0) { 383 PyOS_snprintf(p, sizeof(buf) - (p - buf), 384 "argument %d", iarg); 385 i = 0; 386 p += strlen(p); 387 while (levels[i] > 0 && i < 32 && (int)(p-buf) < 220) { 388 PyOS_snprintf(p, sizeof(buf) - (p - buf), 389 ", item %d", levels[i]-1); 390 p += strlen(p); 391 i++; 392 } 393 } 394 else { 395 PyOS_snprintf(p, sizeof(buf) - (p - buf), "argument"); 396 p += strlen(p); 397 } 398 PyOS_snprintf(p, sizeof(buf) - (p - buf), " %.256s", msg); 399 message = buf; 400 } 401 PyErr_SetString(PyExc_TypeError, message); 402 } 403 404 405 /* Convert a tuple argument. 406 On entry, *p_format points to the character _after_ the opening '('. 407 On successful exit, *p_format points to the closing ')'. 408 If successful: 409 *p_format and *p_va are updated, 410 *levels and *msgbuf are untouched, 411 and NULL is returned. 412 If the argument is invalid: 413 *p_format is unchanged, 414 *p_va is undefined, 415 *levels is a 0-terminated list of item numbers, 416 *msgbuf contains an error message, whose format is: 417 "must be <typename1>, not <typename2>", where: 418 <typename1> is the name of the expected type, and 419 <typename2> is the name of the actual type, 420 and msgbuf is returned. 421 */ 422 423 static char * 424 converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags, 425 int *levels, char *msgbuf, size_t bufsize, int toplevel, 426 PyObject **freelist) 427 { 428 int level = 0; 429 int n = 0; 430 const char *format = *p_format; 431 int i; 432 433 for (;;) { 434 int c = *format++; 435 if (c == '(') { 436 if (level == 0) 437 n++; 438 level++; 439 } 440 else if (c == ')') { 441 if (level == 0) 442 break; 443 level--; 444 } 445 else if (c == ':' || c == ';' || c == '\0') 446 break; 447 else if (level == 0 && isalpha(Py_CHARMASK(c))) 448 n++; 449 } 450 451 if (!PySequence_Check(arg) || PyString_Check(arg)) { 452 levels[0] = 0; 453 PyOS_snprintf(msgbuf, bufsize, 454 toplevel ? "expected %d arguments, not %.50s" : 455 "must be %d-item sequence, not %.50s", 456 n, 457 arg == Py_None ? "None" : arg->ob_type->tp_name); 458 return msgbuf; 459 } 460 461 if ((i = PySequence_Size(arg)) != n) { 462 levels[0] = 0; 463 PyOS_snprintf(msgbuf, bufsize, 464 toplevel ? "expected %d arguments, not %d" : 465 "must be sequence of length %d, not %d", 466 n, i); 467 return msgbuf; 468 } 469 470 format = *p_format; 471 for (i = 0; i < n; i++) { 472 char *msg; 473 PyObject *item; 474 item = PySequence_GetItem(arg, i); 475 if (item == NULL) { 476 PyErr_Clear(); 477 levels[0] = i+1; 478 levels[1] = 0; 479 strncpy(msgbuf, "is not retrievable", bufsize); 480 return msgbuf; 481 } 482 msg = convertitem(item, &format, p_va, flags, levels+1, 483 msgbuf, bufsize, freelist); 484 /* PySequence_GetItem calls tp->sq_item, which INCREFs */ 485 Py_XDECREF(item); 486 if (msg != NULL) { 487 levels[0] = i+1; 488 return msg; 489 } 490 } 491 492 *p_format = format; 493 return NULL; 494 } 495 496 497 /* Convert a single item. */ 498 499 static char * 500 convertitem(PyObject *arg, const char **p_format, va_list *p_va, int flags, 501 int *levels, char *msgbuf, size_t bufsize, PyObject **freelist) 502 { 503 char *msg; 504 const char *format = *p_format; 505 506 if (*format == '(' /* ')' */) { 507 format++; 508 msg = converttuple(arg, &format, p_va, flags, levels, msgbuf, 509 bufsize, 0, freelist); 510 if (msg == NULL) 511 format++; 512 } 513 else { 514 msg = convertsimple(arg, &format, p_va, flags, 515 msgbuf, bufsize, freelist); 516 if (msg != NULL) 517 levels[0] = 0; 518 } 519 if (msg == NULL) 520 *p_format = format; 521 return msg; 522 } 523 524 525 526 #define UNICODE_DEFAULT_ENCODING(arg) \ 527 _PyUnicode_AsDefaultEncodedString(arg, NULL) 528 529 /* Format an error message generated by convertsimple(). */ 530 531 static char * 532 converterr(const char *expected, PyObject *arg, char *msgbuf, size_t bufsize) 533 { 534 assert(expected != NULL); 535 assert(arg != NULL); 536 PyOS_snprintf(msgbuf, bufsize, 537 "must be %.50s, not %.50s", expected, 538 arg == Py_None ? "None" : arg->ob_type->tp_name); 539 return msgbuf; 540 } 541 542 #define CONV_UNICODE "(unicode conversion error)" 543 544 /* explicitly check for float arguments when integers are expected. For now 545 * signal a warning. Returns true if an exception was raised. */ 546 static int 547 float_argument_warning(PyObject *arg) 548 { 549 if (PyFloat_Check(arg) && 550 PyErr_Warn(PyExc_DeprecationWarning, 551 "integer argument expected, got float" )) 552 return 1; 553 else 554 return 0; 555 } 556 557 /* explicitly check for float arguments when integers are expected. Raises 558 TypeError and returns true for float arguments. */ 559 static int 560 float_argument_error(PyObject *arg) 561 { 562 if (PyFloat_Check(arg)) { 563 PyErr_SetString(PyExc_TypeError, 564 "integer argument expected, got float"); 565 return 1; 566 } 567 else 568 return 0; 569 } 570 571 /* Convert a non-tuple argument. Return NULL if conversion went OK, 572 or a string with a message describing the failure. The message is 573 formatted as "must be <desired type>, not <actual type>". 574 When failing, an exception may or may not have been raised. 575 Don't call if a tuple is expected. 576 577 When you add new format codes, please don't forget poor skipitem() below. 578 */ 579 580 static char * 581 convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, 582 char *msgbuf, size_t bufsize, PyObject **freelist) 583 { 584 /* For # codes */ 585 #define FETCH_SIZE int *q=NULL;Py_ssize_t *q2=NULL;\ 586 if (flags & FLAG_SIZE_T) q2=va_arg(*p_va, Py_ssize_t*); \ 587 else q=va_arg(*p_va, int*); 588 #define STORE_SIZE(s) \ 589 if (flags & FLAG_SIZE_T) \ 590 *q2=s; \ 591 else { \ 592 if (INT_MAX < s) { \ 593 PyErr_SetString(PyExc_OverflowError, \ 594 "size does not fit in an int"); \ 595 return converterr("", arg, msgbuf, bufsize); \ 596 } \ 597 *q=s; \ 598 } 599 #define BUFFER_LEN ((flags & FLAG_SIZE_T) ? *q2:*q) 600 601 const char *format = *p_format; 602 char c = *format++; 603 #ifdef Py_USING_UNICODE 604 PyObject *uarg; 605 #endif 606 607 switch (c) { 608 609 case 'b': { /* unsigned byte -- very short int */ 610 char *p = va_arg(*p_va, char *); 611 long ival; 612 if (float_argument_error(arg)) 613 return converterr("integer<b>", arg, msgbuf, bufsize); 614 ival = PyInt_AsLong(arg); 615 if (ival == -1 && PyErr_Occurred()) 616 return converterr("integer<b>", arg, msgbuf, bufsize); 617 else if (ival < 0) { 618 PyErr_SetString(PyExc_OverflowError, 619 "unsigned byte integer is less than minimum"); 620 return converterr("integer<b>", arg, msgbuf, bufsize); 621 } 622 else if (ival > UCHAR_MAX) { 623 PyErr_SetString(PyExc_OverflowError, 624 "unsigned byte integer is greater than maximum"); 625 return converterr("integer<b>", arg, msgbuf, bufsize); 626 } 627 else 628 *p = (unsigned char) ival; 629 break; 630 } 631 632 case 'B': {/* byte sized bitfield - both signed and unsigned 633 values allowed */ 634 char *p = va_arg(*p_va, char *); 635 long ival; 636 if (float_argument_error(arg)) 637 return converterr("integer<B>", arg, msgbuf, bufsize); 638 ival = PyInt_AsUnsignedLongMask(arg); 639 if (ival == -1 && PyErr_Occurred()) 640 return converterr("integer<B>", arg, msgbuf, bufsize); 641 else 642 *p = (unsigned char) ival; 643 break; 644 } 645 646 case 'h': {/* signed short int */ 647 short *p = va_arg(*p_va, short *); 648 long ival; 649 if (float_argument_error(arg)) 650 return converterr("integer<h>", arg, msgbuf, bufsize); 651 ival = PyInt_AsLong(arg); 652 if (ival == -1 && PyErr_Occurred()) 653 return converterr("integer<h>", arg, msgbuf, bufsize); 654 else if (ival < SHRT_MIN) { 655 PyErr_SetString(PyExc_OverflowError, 656 "signed short integer is less than minimum"); 657 return converterr("integer<h>", arg, msgbuf, bufsize); 658 } 659 else if (ival > SHRT_MAX) { 660 PyErr_SetString(PyExc_OverflowError, 661 "signed short integer is greater than maximum"); 662 return converterr("integer<h>", arg, msgbuf, bufsize); 663 } 664 else 665 *p = (short) ival; 666 break; 667 } 668 669 case 'H': { /* short int sized bitfield, both signed and 670 unsigned allowed */ 671 unsigned short *p = va_arg(*p_va, unsigned short *); 672 long ival; 673 if (float_argument_error(arg)) 674 return converterr("integer<H>", arg, msgbuf, bufsize); 675 ival = PyInt_AsUnsignedLongMask(arg); 676 if (ival == -1 && PyErr_Occurred()) 677 return converterr("integer<H>", arg, msgbuf, bufsize); 678 else 679 *p = (unsigned short) ival; 680 break; 681 } 682 683 case 'i': {/* signed int */ 684 int *p = va_arg(*p_va, int *); 685 long ival; 686 if (float_argument_error(arg)) 687 return converterr("integer<i>", arg, msgbuf, bufsize); 688 ival = PyInt_AsLong(arg); 689 if (ival == -1 && PyErr_Occurred()) 690 return converterr("integer<i>", arg, msgbuf, bufsize); 691 else if (ival > INT_MAX) { 692 PyErr_SetString(PyExc_OverflowError, 693 "signed integer is greater than maximum"); 694 return converterr("integer<i>", arg, msgbuf, bufsize); 695 } 696 else if (ival < INT_MIN) { 697 PyErr_SetString(PyExc_OverflowError, 698 "signed integer is less than minimum"); 699 return converterr("integer<i>", arg, msgbuf, bufsize); 700 } 701 else 702 *p = ival; 703 break; 704 } 705 706 case 'I': { /* int sized bitfield, both signed and 707 unsigned allowed */ 708 unsigned int *p = va_arg(*p_va, unsigned int *); 709 unsigned int ival; 710 if (float_argument_error(arg)) 711 return converterr("integer<I>", arg, msgbuf, bufsize); 712 ival = (unsigned int)PyInt_AsUnsignedLongMask(arg); 713 if (ival == (unsigned int)-1 && PyErr_Occurred()) 714 return converterr("integer<I>", arg, msgbuf, bufsize); 715 else 716 *p = ival; 717 break; 718 } 719 720 case 'n': /* Py_ssize_t */ 721 #if SIZEOF_SIZE_T != SIZEOF_LONG 722 { 723 Py_ssize_t *p = va_arg(*p_va, Py_ssize_t *); 724 Py_ssize_t ival; 725 if (float_argument_error(arg)) 726 return converterr("integer<n>", arg, msgbuf, bufsize); 727 ival = PyInt_AsSsize_t(arg); 728 if (ival == -1 && PyErr_Occurred()) 729 return converterr("integer<n>", arg, msgbuf, bufsize); 730 *p = ival; 731 break; 732 } 733 #endif 734 /* Fall through from 'n' to 'l' if Py_ssize_t is int */ 735 case 'l': {/* long int */ 736 long *p = va_arg(*p_va, long *); 737 long ival; 738 if (float_argument_error(arg)) 739 return converterr("integer<l>", arg, msgbuf, bufsize); 740 ival = PyInt_AsLong(arg); 741 if (ival == -1 && PyErr_Occurred()) 742 return converterr("integer<l>", arg, msgbuf, bufsize); 743 else 744 *p = ival; 745 break; 746 } 747 748 case 'k': { /* long sized bitfield */ 749 unsigned long *p = va_arg(*p_va, unsigned long *); 750 unsigned long ival; 751 if (PyInt_Check(arg)) 752 ival = PyInt_AsUnsignedLongMask(arg); 753 else if (PyLong_Check(arg)) 754 ival = PyLong_AsUnsignedLongMask(arg); 755 else 756 return converterr("integer<k>", arg, msgbuf, bufsize); 757 *p = ival; 758 break; 759 } 760 761 #ifdef HAVE_LONG_LONG 762 case 'L': {/* PY_LONG_LONG */ 763 PY_LONG_LONG *p = va_arg( *p_va, PY_LONG_LONG * ); 764 PY_LONG_LONG ival; 765 if (float_argument_warning(arg)) 766 return converterr("long<L>", arg, msgbuf, bufsize); 767 ival = PyLong_AsLongLong(arg); 768 if (ival == (PY_LONG_LONG)-1 && PyErr_Occurred() ) { 769 return converterr("long<L>", arg, msgbuf, bufsize); 770 } else { 771 *p = ival; 772 } 773 break; 774 } 775 776 case 'K': { /* long long sized bitfield */ 777 unsigned PY_LONG_LONG *p = va_arg(*p_va, unsigned PY_LONG_LONG *); 778 unsigned PY_LONG_LONG ival; 779 if (PyInt_Check(arg)) 780 ival = PyInt_AsUnsignedLongMask(arg); 781 else if (PyLong_Check(arg)) 782 ival = PyLong_AsUnsignedLongLongMask(arg); 783 else 784 return converterr("integer<K>", arg, msgbuf, bufsize); 785 *p = ival; 786 break; 787 } 788 #endif 789 790 case 'f': {/* float */ 791 float *p = va_arg(*p_va, float *); 792 double dval = PyFloat_AsDouble(arg); 793 if (PyErr_Occurred()) 794 return converterr("float<f>", arg, msgbuf, bufsize); 795 else 796 *p = (float) dval; 797 break; 798 } 799 800 case 'd': {/* double */ 801 double *p = va_arg(*p_va, double *); 802 double dval = PyFloat_AsDouble(arg); 803 if (PyErr_Occurred()) 804 return converterr("float<d>", arg, msgbuf, bufsize); 805 else 806 *p = dval; 807 break; 808 } 809 810 #ifndef WITHOUT_COMPLEX 811 case 'D': {/* complex double */ 812 Py_complex *p = va_arg(*p_va, Py_complex *); 813 Py_complex cval; 814 cval = PyComplex_AsCComplex(arg); 815 if (PyErr_Occurred()) 816 return converterr("complex<D>", arg, msgbuf, bufsize); 817 else 818 *p = cval; 819 break; 820 } 821 #endif /* WITHOUT_COMPLEX */ 822 823 case 'c': {/* char */ 824 char *p = va_arg(*p_va, char *); 825 if (PyString_Check(arg) && PyString_Size(arg) == 1) 826 *p = PyString_AS_STRING(arg)[0]; 827 else 828 return converterr("char", arg, msgbuf, bufsize); 829 break; 830 } 831 832 case 's': {/* string */ 833 if (*format == '*') { 834 Py_buffer *p = (Py_buffer *)va_arg(*p_va, Py_buffer *); 835 836 if (PyString_Check(arg)) { 837 PyBuffer_FillInfo(p, arg, 838 PyString_AS_STRING(arg), PyString_GET_SIZE(arg), 839 1, 0); 840 } 841 #ifdef Py_USING_UNICODE 842 else if (PyUnicode_Check(arg)) { 843 uarg = UNICODE_DEFAULT_ENCODING(arg); 844 if (uarg == NULL) 845 return converterr(CONV_UNICODE, 846 arg, msgbuf, bufsize); 847 PyBuffer_FillInfo(p, arg, 848 PyString_AS_STRING(uarg), PyString_GET_SIZE(uarg), 849 1, 0); 850 } 851 #endif 852 else { /* any buffer-like object */ 853 char *buf; 854 if (getbuffer(arg, p, &buf) < 0) 855 return converterr(buf, arg, msgbuf, bufsize); 856 } 857 if (addcleanup(p, freelist, cleanup_buffer)) { 858 return converterr( 859 "(cleanup problem)", 860 arg, msgbuf, bufsize); 861 } 862 format++; 863 } else if (*format == '#') { 864 void **p = (void **)va_arg(*p_va, char **); 865 FETCH_SIZE; 866 867 if (PyString_Check(arg)) { 868 *p = PyString_AS_STRING(arg); 869 STORE_SIZE(PyString_GET_SIZE(arg)); 870 } 871 #ifdef Py_USING_UNICODE 872 else if (PyUnicode_Check(arg)) { 873 uarg = UNICODE_DEFAULT_ENCODING(arg); 874 if (uarg == NULL) 875 return converterr(CONV_UNICODE, 876 arg, msgbuf, bufsize); 877 *p = PyString_AS_STRING(uarg); 878 STORE_SIZE(PyString_GET_SIZE(uarg)); 879 } 880 #endif 881 else { /* any buffer-like object */ 882 char *buf; 883 Py_ssize_t count = convertbuffer(arg, p, &buf); 884 if (count < 0) 885 return converterr(buf, arg, msgbuf, bufsize); 886 STORE_SIZE(count); 887 } 888 format++; 889 } else { 890 char **p = va_arg(*p_va, char **); 891 892 if (PyString_Check(arg)) 893 *p = PyString_AS_STRING(arg); 894 #ifdef Py_USING_UNICODE 895 else if (PyUnicode_Check(arg)) { 896 uarg = UNICODE_DEFAULT_ENCODING(arg); 897 if (uarg == NULL) 898 return converterr(CONV_UNICODE, 899 arg, msgbuf, bufsize); 900 *p = PyString_AS_STRING(uarg); 901 } 902 #endif 903 else 904 return converterr("string", arg, msgbuf, bufsize); 905 if ((Py_ssize_t)strlen(*p) != PyString_Size(arg)) 906 return converterr("string without null bytes", 907 arg, msgbuf, bufsize); 908 } 909 break; 910 } 911 912 case 'z': {/* string, may be NULL (None) */ 913 if (*format == '*') { 914 Py_buffer *p = (Py_buffer *)va_arg(*p_va, Py_buffer *); 915 916 if (arg == Py_None) 917 PyBuffer_FillInfo(p, NULL, NULL, 0, 1, 0); 918 else if (PyString_Check(arg)) { 919 PyBuffer_FillInfo(p, arg, 920 PyString_AS_STRING(arg), PyString_GET_SIZE(arg), 921 1, 0); 922 } 923 #ifdef Py_USING_UNICODE 924 else if (PyUnicode_Check(arg)) { 925 uarg = UNICODE_DEFAULT_ENCODING(arg); 926 if (uarg == NULL) 927 return converterr(CONV_UNICODE, 928 arg, msgbuf, bufsize); 929 PyBuffer_FillInfo(p, arg, 930 PyString_AS_STRING(uarg), PyString_GET_SIZE(uarg), 931 1, 0); 932 } 933 #endif 934 else { /* any buffer-like object */ 935 char *buf; 936 if (getbuffer(arg, p, &buf) < 0) 937 return converterr(buf, arg, msgbuf, bufsize); 938 } 939 if (addcleanup(p, freelist, cleanup_buffer)) { 940 return converterr( 941 "(cleanup problem)", 942 arg, msgbuf, bufsize); 943 } 944 format++; 945 } else if (*format == '#') { /* any buffer-like object */ 946 void **p = (void **)va_arg(*p_va, char **); 947 FETCH_SIZE; 948 949 if (arg == Py_None) { 950 *p = 0; 951 STORE_SIZE(0); 952 } 953 else if (PyString_Check(arg)) { 954 *p = PyString_AS_STRING(arg); 955 STORE_SIZE(PyString_GET_SIZE(arg)); 956 } 957 #ifdef Py_USING_UNICODE 958 else if (PyUnicode_Check(arg)) { 959 uarg = UNICODE_DEFAULT_ENCODING(arg); 960 if (uarg == NULL) 961 return converterr(CONV_UNICODE, 962 arg, msgbuf, bufsize); 963 *p = PyString_AS_STRING(uarg); 964 STORE_SIZE(PyString_GET_SIZE(uarg)); 965 } 966 #endif 967 else { /* any buffer-like object */ 968 char *buf; 969 Py_ssize_t count = convertbuffer(arg, p, &buf); 970 if (count < 0) 971 return converterr(buf, arg, msgbuf, bufsize); 972 STORE_SIZE(count); 973 } 974 format++; 975 } else { 976 char **p = va_arg(*p_va, char **); 977 978 if (arg == Py_None) 979 *p = 0; 980 else if (PyString_Check(arg)) 981 *p = PyString_AS_STRING(arg); 982 #ifdef Py_USING_UNICODE 983 else if (PyUnicode_Check(arg)) { 984 uarg = UNICODE_DEFAULT_ENCODING(arg); 985 if (uarg == NULL) 986 return converterr(CONV_UNICODE, 987 arg, msgbuf, bufsize); 988 *p = PyString_AS_STRING(uarg); 989 } 990 #endif 991 else 992 return converterr("string or None", 993 arg, msgbuf, bufsize); 994 if (*format == '#') { 995 FETCH_SIZE; 996 assert(0); /* XXX redundant with if-case */ 997 if (arg == Py_None) { 998 STORE_SIZE(0); 999 } else { 1000 STORE_SIZE(PyString_Size(arg)); 1001 } 1002 format++; 1003 } 1004 else if (*p != NULL && 1005 (Py_ssize_t)strlen(*p) != PyString_Size(arg)) 1006 return converterr( 1007 "string without null bytes or None", 1008 arg, msgbuf, bufsize); 1009 } 1010 break; 1011 } 1012 1013 case 'e': {/* encoded string */ 1014 char **buffer; 1015 const char *encoding; 1016 PyObject *s; 1017 Py_ssize_t size; 1018 int recode_strings; 1019 1020 /* Get 'e' parameter: the encoding name */ 1021 encoding = (const char *)va_arg(*p_va, const char *); 1022 #ifdef Py_USING_UNICODE 1023 if (encoding == NULL) 1024 encoding = PyUnicode_GetDefaultEncoding(); 1025 #endif 1026 1027 /* Get output buffer parameter: 1028 's' (recode all objects via Unicode) or 1029 't' (only recode non-string objects) 1030 */ 1031 if (*format == 's') 1032 recode_strings = 1; 1033 else if (*format == 't') 1034 recode_strings = 0; 1035 else 1036 return converterr( 1037 "(unknown parser marker combination)", 1038 arg, msgbuf, bufsize); 1039 buffer = (char **)va_arg(*p_va, char **); 1040 format++; 1041 if (buffer == NULL) 1042 return converterr("(buffer is NULL)", 1043 arg, msgbuf, bufsize); 1044 1045 /* Encode object */ 1046 if (!recode_strings && PyString_Check(arg)) { 1047 s = arg; 1048 Py_INCREF(s); 1049 } 1050 else { 1051 #ifdef Py_USING_UNICODE 1052 PyObject *u; 1053 1054 /* Convert object to Unicode */ 1055 u = PyUnicode_FromObject(arg); 1056 if (u == NULL) 1057 return converterr( 1058 "string or unicode or text buffer", 1059 arg, msgbuf, bufsize); 1060 1061 /* Encode object; use default error handling */ 1062 s = PyUnicode_AsEncodedString(u, 1063 encoding, 1064 NULL); 1065 Py_DECREF(u); 1066 if (s == NULL) 1067 return converterr("(encoding failed)", 1068 arg, msgbuf, bufsize); 1069 if (!PyString_Check(s)) { 1070 Py_DECREF(s); 1071 return converterr( 1072 "(encoder failed to return a string)", 1073 arg, msgbuf, bufsize); 1074 } 1075 #else 1076 return converterr("string<e>", arg, msgbuf, bufsize); 1077 #endif 1078 } 1079 size = PyString_GET_SIZE(s); 1080 1081 /* Write output; output is guaranteed to be 0-terminated */ 1082 if (*format == '#') { 1083 /* Using buffer length parameter '#': 1084 1085 - if *buffer is NULL, a new buffer of the 1086 needed size is allocated and the data 1087 copied into it; *buffer is updated to point 1088 to the new buffer; the caller is 1089 responsible for PyMem_Free()ing it after 1090 usage 1091 1092 - if *buffer is not NULL, the data is 1093 copied to *buffer; *buffer_len has to be 1094 set to the size of the buffer on input; 1095 buffer overflow is signalled with an error; 1096 buffer has to provide enough room for the 1097 encoded string plus the trailing 0-byte 1098 1099 - in both cases, *buffer_len is updated to 1100 the size of the buffer /excluding/ the 1101 trailing 0-byte 1102 1103 */ 1104 FETCH_SIZE; 1105 1106 format++; 1107 if (q == NULL && q2 == NULL) { 1108 Py_DECREF(s); 1109 return converterr( 1110 "(buffer_len is NULL)", 1111 arg, msgbuf, bufsize); 1112 } 1113 if (*buffer == NULL) { 1114 *buffer = PyMem_NEW(char, size + 1); 1115 if (*buffer == NULL) { 1116 Py_DECREF(s); 1117 return converterr( 1118 "(memory error)", 1119 arg, msgbuf, bufsize); 1120 } 1121 if (addcleanup(*buffer, freelist, cleanup_ptr)) { 1122 Py_DECREF(s); 1123 return converterr( 1124 "(cleanup problem)", 1125 arg, msgbuf, bufsize); 1126 } 1127 } else { 1128 if (size + 1 > BUFFER_LEN) { 1129 Py_DECREF(s); 1130 return converterr( 1131 "(buffer overflow)", 1132 arg, msgbuf, bufsize); 1133 } 1134 } 1135 memcpy(*buffer, 1136 PyString_AS_STRING(s), 1137 size + 1); 1138 STORE_SIZE(size); 1139 } else { 1140 /* Using a 0-terminated buffer: 1141 1142 - the encoded string has to be 0-terminated 1143 for this variant to work; if it is not, an 1144 error raised 1145 1146 - a new buffer of the needed size is 1147 allocated and the data copied into it; 1148 *buffer is updated to point to the new 1149 buffer; the caller is responsible for 1150 PyMem_Free()ing it after usage 1151 1152 */ 1153 if ((Py_ssize_t)strlen(PyString_AS_STRING(s)) 1154 != size) { 1155 Py_DECREF(s); 1156 return converterr( 1157 "encoded string without NULL bytes", 1158 arg, msgbuf, bufsize); 1159 } 1160 *buffer = PyMem_NEW(char, size + 1); 1161 if (*buffer == NULL) { 1162 Py_DECREF(s); 1163 return converterr("(memory error)", 1164 arg, msgbuf, bufsize); 1165 } 1166 if (addcleanup(*buffer, freelist, cleanup_ptr)) { 1167 Py_DECREF(s); 1168 return converterr("(cleanup problem)", 1169 arg, msgbuf, bufsize); 1170 } 1171 memcpy(*buffer, 1172 PyString_AS_STRING(s), 1173 size + 1); 1174 } 1175 Py_DECREF(s); 1176 break; 1177 } 1178 1179 #ifdef Py_USING_UNICODE 1180 case 'u': {/* raw unicode buffer (Py_UNICODE *) */ 1181 if (*format == '#') { /* any buffer-like object */ 1182 void **p = (void **)va_arg(*p_va, char **); 1183 FETCH_SIZE; 1184 if (PyUnicode_Check(arg)) { 1185 *p = PyUnicode_AS_UNICODE(arg); 1186 STORE_SIZE(PyUnicode_GET_SIZE(arg)); 1187 } 1188 else { 1189 return converterr("cannot convert raw buffers", 1190 arg, msgbuf, bufsize); 1191 } 1192 format++; 1193 } else { 1194 Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **); 1195 if (PyUnicode_Check(arg)) 1196 *p = PyUnicode_AS_UNICODE(arg); 1197 else 1198 return converterr("unicode", arg, msgbuf, bufsize); 1199 } 1200 break; 1201 } 1202 #endif 1203 1204 case 'S': { /* string object */ 1205 PyObject **p = va_arg(*p_va, PyObject **); 1206 if (PyString_Check(arg)) 1207 *p = arg; 1208 else 1209 return converterr("string", arg, msgbuf, bufsize); 1210 break; 1211 } 1212 1213 #ifdef Py_USING_UNICODE 1214 case 'U': { /* Unicode object */ 1215 PyObject **p = va_arg(*p_va, PyObject **); 1216 if (PyUnicode_Check(arg)) 1217 *p = arg; 1218 else 1219 return converterr("unicode", arg, msgbuf, bufsize); 1220 break; 1221 } 1222 #endif 1223 1224 case 'O': { /* object */ 1225 PyTypeObject *type; 1226 PyObject **p; 1227 if (*format == '!') { 1228 type = va_arg(*p_va, PyTypeObject*); 1229 p = va_arg(*p_va, PyObject **); 1230 format++; 1231 if (PyType_IsSubtype(arg->ob_type, type)) 1232 *p = arg; 1233 else 1234 return converterr(type->tp_name, arg, msgbuf, bufsize); 1235 1236 } 1237 else if (*format == '?') { 1238 inquiry pred = va_arg(*p_va, inquiry); 1239 p = va_arg(*p_va, PyObject **); 1240 format++; 1241 if ((*pred)(arg)) 1242 *p = arg; 1243 else 1244 return converterr("(unspecified)", 1245 arg, msgbuf, bufsize); 1246 1247 } 1248 else if (*format == '&') { 1249 typedef int (*converter)(PyObject *, void *); 1250 converter convert = va_arg(*p_va, converter); 1251 void *addr = va_arg(*p_va, void *); 1252 format++; 1253 if (! (*convert)(arg, addr)) 1254 return converterr("(unspecified)", 1255 arg, msgbuf, bufsize); 1256 } 1257 else { 1258 p = va_arg(*p_va, PyObject **); 1259 *p = arg; 1260 } 1261 break; 1262 } 1263 1264 1265 case 'w': { /* memory buffer, read-write access */ 1266 void **p = va_arg(*p_va, void **); 1267 void *res; 1268 PyBufferProcs *pb = arg->ob_type->tp_as_buffer; 1269 Py_ssize_t count; 1270 1271 if (pb && pb->bf_releasebuffer && *format != '*') 1272 /* Buffer must be released, yet caller does not use 1273 the Py_buffer protocol. */ 1274 return converterr("pinned buffer", arg, msgbuf, bufsize); 1275 1276 if (pb && pb->bf_getbuffer && *format == '*') { 1277 /* Caller is interested in Py_buffer, and the object 1278 supports it directly. */ 1279 format++; 1280 if (pb->bf_getbuffer(arg, (Py_buffer*)p, PyBUF_WRITABLE) < 0) { 1281 PyErr_Clear(); 1282 return converterr("read-write buffer", arg, msgbuf, bufsize); 1283 } 1284 if (addcleanup(p, freelist, cleanup_buffer)) { 1285 return converterr( 1286 "(cleanup problem)", 1287 arg, msgbuf, bufsize); 1288 } 1289 if (!PyBuffer_IsContiguous((Py_buffer*)p, 'C')) 1290 return converterr("contiguous buffer", arg, msgbuf, bufsize); 1291 break; 1292 } 1293 1294 if (pb == NULL || 1295 pb->bf_getwritebuffer == NULL || 1296 pb->bf_getsegcount == NULL) 1297 return converterr("read-write buffer", arg, msgbuf, bufsize); 1298 if ((*pb->bf_getsegcount)(arg, NULL) != 1) 1299 return converterr("single-segment read-write buffer", 1300 arg, msgbuf, bufsize); 1301 if ((count = pb->bf_getwritebuffer(arg, 0, &res)) < 0) 1302 return converterr("(unspecified)", arg, msgbuf, bufsize); 1303 if (*format == '*') { 1304 PyBuffer_FillInfo((Py_buffer*)p, arg, res, count, 1, 0); 1305 format++; 1306 } 1307 else { 1308 *p = res; 1309 if (*format == '#') { 1310 FETCH_SIZE; 1311 STORE_SIZE(count); 1312 format++; 1313 } 1314 } 1315 break; 1316 } 1317 1318 case 't': { /* 8-bit character buffer, read-only access */ 1319 char **p = va_arg(*p_va, char **); 1320 PyBufferProcs *pb = arg->ob_type->tp_as_buffer; 1321 Py_ssize_t count; 1322 1323 if (*format++ != '#') 1324 return converterr( 1325 "invalid use of 't' format character", 1326 arg, msgbuf, bufsize); 1327 if (!PyType_HasFeature(arg->ob_type, 1328 Py_TPFLAGS_HAVE_GETCHARBUFFER) || 1329 pb == NULL || pb->bf_getcharbuffer == NULL || 1330 pb->bf_getsegcount == NULL) 1331 return converterr( 1332 "string or read-only character buffer", 1333 arg, msgbuf, bufsize); 1334 1335 if (pb->bf_getsegcount(arg, NULL) != 1) 1336 return converterr( 1337 "string or single-segment read-only buffer", 1338 arg, msgbuf, bufsize); 1339 1340 if (pb->bf_releasebuffer) 1341 return converterr( 1342 "string or pinned buffer", 1343 arg, msgbuf, bufsize); 1344 1345 count = pb->bf_getcharbuffer(arg, 0, p); 1346 if (count < 0) 1347 return converterr("(unspecified)", arg, msgbuf, bufsize); 1348 { 1349 FETCH_SIZE; 1350 STORE_SIZE(count); 1351 } 1352 break; 1353 } 1354 1355 default: 1356 return converterr("impossible<bad format char>", arg, msgbuf, bufsize); 1357 1358 } 1359 1360 *p_format = format; 1361 return NULL; 1362 } 1363 1364 static Py_ssize_t 1365 convertbuffer(PyObject *arg, void **p, char **errmsg) 1366 { 1367 PyBufferProcs *pb = arg->ob_type->tp_as_buffer; 1368 Py_ssize_t count; 1369 if (pb == NULL || 1370 pb->bf_getreadbuffer == NULL || 1371 pb->bf_getsegcount == NULL || 1372 pb->bf_releasebuffer != NULL) { 1373 *errmsg = "string or read-only buffer"; 1374 return -1; 1375 } 1376 if ((*pb->bf_getsegcount)(arg, NULL) != 1) { 1377 *errmsg = "string or single-segment read-only buffer"; 1378 return -1; 1379 } 1380 if ((count = (*pb->bf_getreadbuffer)(arg, 0, p)) < 0) { 1381 *errmsg = "(unspecified)"; 1382 } 1383 return count; 1384 } 1385 1386 static int 1387 getbuffer(PyObject *arg, Py_buffer *view, char **errmsg) 1388 { 1389 void *buf; 1390 Py_ssize_t count; 1391 PyBufferProcs *pb = arg->ob_type->tp_as_buffer; 1392 if (pb == NULL) { 1393 *errmsg = "string or buffer"; 1394 return -1; 1395 } 1396 if (pb->bf_getbuffer) { 1397 if (pb->bf_getbuffer(arg, view, 0) < 0) { 1398 *errmsg = "convertible to a buffer"; 1399 return -1; 1400 } 1401 if (!PyBuffer_IsContiguous(view, 'C')) { 1402 *errmsg = "contiguous buffer"; 1403 return -1; 1404 } 1405 return 0; 1406 } 1407 1408 count = convertbuffer(arg, &buf, errmsg); 1409 if (count < 0) { 1410 *errmsg = "convertible to a buffer"; 1411 return count; 1412 } 1413 PyBuffer_FillInfo(view, arg, buf, count, 1, 0); 1414 return 0; 1415 } 1416 1417 /* Support for keyword arguments donated by 1418 Geoff Philbrick <philbric (at) delphi.hks.com> */ 1419 1420 /* Return false (0) for error, else true. */ 1421 int 1422 PyArg_ParseTupleAndKeywords(PyObject *args, 1423 PyObject *keywords, 1424 const char *format, 1425 char **kwlist, ...) 1426 { 1427 int retval; 1428 va_list va; 1429 1430 if ((args == NULL || !PyTuple_Check(args)) || 1431 (keywords != NULL && !PyDict_Check(keywords)) || 1432 format == NULL || 1433 kwlist == NULL) 1434 { 1435 PyErr_BadInternalCall(); 1436 return 0; 1437 } 1438 1439 va_start(va, kwlist); 1440 retval = vgetargskeywords(args, keywords, format, kwlist, &va, 0); 1441 va_end(va); 1442 return retval; 1443 } 1444 1445 int 1446 _PyArg_ParseTupleAndKeywords_SizeT(PyObject *args, 1447 PyObject *keywords, 1448 const char *format, 1449 char **kwlist, ...) 1450 { 1451 int retval; 1452 va_list va; 1453 1454 if ((args == NULL || !PyTuple_Check(args)) || 1455 (keywords != NULL && !PyDict_Check(keywords)) || 1456 format == NULL || 1457 kwlist == NULL) 1458 { 1459 PyErr_BadInternalCall(); 1460 return 0; 1461 } 1462 1463 va_start(va, kwlist); 1464 retval = vgetargskeywords(args, keywords, format, 1465 kwlist, &va, FLAG_SIZE_T); 1466 va_end(va); 1467 return retval; 1468 } 1469 1470 1471 int 1472 PyArg_VaParseTupleAndKeywords(PyObject *args, 1473 PyObject *keywords, 1474 const char *format, 1475 char **kwlist, va_list va) 1476 { 1477 int retval; 1478 va_list lva; 1479 1480 if ((args == NULL || !PyTuple_Check(args)) || 1481 (keywords != NULL && !PyDict_Check(keywords)) || 1482 format == NULL || 1483 kwlist == NULL) 1484 { 1485 PyErr_BadInternalCall(); 1486 return 0; 1487 } 1488 1489 #ifdef VA_LIST_IS_ARRAY 1490 memcpy(lva, va, sizeof(va_list)); 1491 #else 1492 #ifdef __va_copy 1493 __va_copy(lva, va); 1494 #else 1495 lva = va; 1496 #endif 1497 #endif 1498 1499 retval = vgetargskeywords(args, keywords, format, kwlist, &lva, 0); 1500 return retval; 1501 } 1502 1503 int 1504 _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *args, 1505 PyObject *keywords, 1506 const char *format, 1507 char **kwlist, va_list va) 1508 { 1509 int retval; 1510 va_list lva; 1511 1512 if ((args == NULL || !PyTuple_Check(args)) || 1513 (keywords != NULL && !PyDict_Check(keywords)) || 1514 format == NULL || 1515 kwlist == NULL) 1516 { 1517 PyErr_BadInternalCall(); 1518 return 0; 1519 } 1520 1521 #ifdef VA_LIST_IS_ARRAY 1522 memcpy(lva, va, sizeof(va_list)); 1523 #else 1524 #ifdef __va_copy 1525 __va_copy(lva, va); 1526 #else 1527 lva = va; 1528 #endif 1529 #endif 1530 1531 retval = vgetargskeywords(args, keywords, format, 1532 kwlist, &lva, FLAG_SIZE_T); 1533 return retval; 1534 } 1535 1536 #define IS_END_OF_FORMAT(c) (c == '\0' || c == ';' || c == ':') 1537 1538 static int 1539 vgetargskeywords(PyObject *args, PyObject *keywords, const char *format, 1540 char **kwlist, va_list *p_va, int flags) 1541 { 1542 char msgbuf[512]; 1543 int levels[32]; 1544 const char *fname, *msg, *custom_msg, *keyword; 1545 int min = INT_MAX; 1546 int i, len, nargs, nkeywords; 1547 PyObject *freelist = NULL, *current_arg; 1548 1549 assert(args != NULL && PyTuple_Check(args)); 1550 assert(keywords == NULL || PyDict_Check(keywords)); 1551 assert(format != NULL); 1552 assert(kwlist != NULL); 1553 assert(p_va != NULL); 1554 1555 /* grab the function name or custom error msg first (mutually exclusive) */ 1556 fname = strchr(format, ':'); 1557 if (fname) { 1558 fname++; 1559 custom_msg = NULL; 1560 } 1561 else { 1562 custom_msg = strchr(format,';'); 1563 if (custom_msg) 1564 custom_msg++; 1565 } 1566 1567 /* scan kwlist and get greatest possible nbr of args */ 1568 for (len=0; kwlist[len]; len++) 1569 continue; 1570 1571 nargs = PyTuple_GET_SIZE(args); 1572 nkeywords = (keywords == NULL) ? 0 : PyDict_Size(keywords); 1573 if (nargs + nkeywords > len) { 1574 PyErr_Format(PyExc_TypeError, "%s%s takes at most %d " 1575 "argument%s (%d given)", 1576 (fname == NULL) ? "function" : fname, 1577 (fname == NULL) ? "" : "()", 1578 len, 1579 (len == 1) ? "" : "s", 1580 nargs + nkeywords); 1581 return 0; 1582 } 1583 1584 /* convert tuple args and keyword args in same loop, using kwlist to drive process */ 1585 for (i = 0; i < len; i++) { 1586 keyword = kwlist[i]; 1587 if (*format == '|') { 1588 min = i; 1589 format++; 1590 } 1591 if (IS_END_OF_FORMAT(*format)) { 1592 PyErr_Format(PyExc_RuntimeError, 1593 "More keyword list entries (%d) than " 1594 "format specifiers (%d)", len, i); 1595 return cleanreturn(0, freelist); 1596 } 1597 current_arg = NULL; 1598 if (nkeywords) { 1599 current_arg = PyDict_GetItemString(keywords, keyword); 1600 } 1601 if (current_arg) { 1602 --nkeywords; 1603 if (i < nargs) { 1604 /* arg present in tuple and in dict */ 1605 PyErr_Format(PyExc_TypeError, 1606 "Argument given by name ('%s') " 1607 "and position (%d)", 1608 keyword, i+1); 1609 return cleanreturn(0, freelist); 1610 } 1611 } 1612 else if (nkeywords && PyErr_Occurred()) 1613 return cleanreturn(0, freelist); 1614 else if (i < nargs) 1615 current_arg = PyTuple_GET_ITEM(args, i); 1616 1617 if (current_arg) { 1618 msg = convertitem(current_arg, &format, p_va, flags, 1619 levels, msgbuf, sizeof(msgbuf), &freelist); 1620 if (msg) { 1621 seterror(i+1, msg, levels, fname, custom_msg); 1622 return cleanreturn(0, freelist); 1623 } 1624 continue; 1625 } 1626 1627 if (i < min) { 1628 PyErr_Format(PyExc_TypeError, "Required argument " 1629 "'%s' (pos %d) not found", 1630 keyword, i+1); 1631 return cleanreturn(0, freelist); 1632 } 1633 /* current code reports success when all required args 1634 * fulfilled and no keyword args left, with no further 1635 * validation. XXX Maybe skip this in debug build ? 1636 */ 1637 if (!nkeywords) 1638 return cleanreturn(1, freelist); 1639 1640 /* We are into optional args, skip thru to any remaining 1641 * keyword args */ 1642 msg = skipitem(&format, p_va, flags); 1643 if (msg) { 1644 PyErr_Format(PyExc_RuntimeError, "%s: '%s'", msg, 1645 format); 1646 return cleanreturn(0, freelist); 1647 } 1648 } 1649 1650 if (!IS_END_OF_FORMAT(*format) && *format != '|') { 1651 PyErr_Format(PyExc_RuntimeError, 1652 "more argument specifiers than keyword list entries " 1653 "(remaining format:'%s')", format); 1654 return cleanreturn(0, freelist); 1655 } 1656 1657 /* make sure there are no extraneous keyword arguments */ 1658 if (nkeywords > 0) { 1659 PyObject *key, *value; 1660 Py_ssize_t pos = 0; 1661 while (PyDict_Next(keywords, &pos, &key, &value)) { 1662 int match = 0; 1663 char *ks; 1664 if (!PyString_Check(key)) { 1665 PyErr_SetString(PyExc_TypeError, 1666 "keywords must be strings"); 1667 return cleanreturn(0, freelist); 1668 } 1669 ks = PyString_AsString(key); 1670 for (i = 0; i < len; i++) { 1671 if (!strcmp(ks, kwlist[i])) { 1672 match = 1; 1673 break; 1674 } 1675 } 1676 if (!match) { 1677 PyErr_Format(PyExc_TypeError, 1678 "'%s' is an invalid keyword " 1679 "argument for this function", 1680 ks); 1681 return cleanreturn(0, freelist); 1682 } 1683 } 1684 } 1685 1686 return cleanreturn(1, freelist); 1687 } 1688 1689 1690 static char * 1691 skipitem(const char **p_format, va_list *p_va, int flags) 1692 { 1693 const char *format = *p_format; 1694 char c = *format++; 1695 1696 switch (c) { 1697 1698 /* simple codes 1699 * The individual types (second arg of va_arg) are irrelevant */ 1700 1701 case 'b': /* byte -- very short int */ 1702 case 'B': /* byte as bitfield */ 1703 case 'h': /* short int */ 1704 case 'H': /* short int as bitfield */ 1705 case 'i': /* int */ 1706 case 'I': /* int sized bitfield */ 1707 case 'l': /* long int */ 1708 case 'k': /* long int sized bitfield */ 1709 #ifdef HAVE_LONG_LONG 1710 case 'L': /* PY_LONG_LONG */ 1711 case 'K': /* PY_LONG_LONG sized bitfield */ 1712 #endif 1713 case 'f': /* float */ 1714 case 'd': /* double */ 1715 #ifndef WITHOUT_COMPLEX 1716 case 'D': /* complex double */ 1717 #endif 1718 case 'c': /* char */ 1719 { 1720 (void) va_arg(*p_va, void *); 1721 break; 1722 } 1723 1724 case 'n': /* Py_ssize_t */ 1725 { 1726 (void) va_arg(*p_va, Py_ssize_t *); 1727 break; 1728 } 1729 1730 /* string codes */ 1731 1732 case 'e': /* string with encoding */ 1733 { 1734 (void) va_arg(*p_va, const char *); 1735 if (!(*format == 's' || *format == 't')) 1736 /* after 'e', only 's' and 't' is allowed */ 1737 goto err; 1738 format++; 1739 /* explicit fallthrough to string cases */ 1740 } 1741 1742 case 's': /* string */ 1743 case 'z': /* string or None */ 1744 #ifdef Py_USING_UNICODE 1745 case 'u': /* unicode string */ 1746 #endif 1747 case 't': /* buffer, read-only */ 1748 case 'w': /* buffer, read-write */ 1749 { 1750 (void) va_arg(*p_va, char **); 1751 if (*format == '#') { 1752 if (flags & FLAG_SIZE_T) 1753 (void) va_arg(*p_va, Py_ssize_t *); 1754 else 1755 (void) va_arg(*p_va, int *); 1756 format++; 1757 } else if ((c == 's' || c == 'z') && *format == '*') { 1758 format++; 1759 } 1760 break; 1761 } 1762 1763 /* object codes */ 1764 1765 case 'S': /* string object */ 1766 #ifdef Py_USING_UNICODE 1767 case 'U': /* unicode string object */ 1768 #endif 1769 { 1770 (void) va_arg(*p_va, PyObject **); 1771 break; 1772 } 1773 1774 case 'O': /* object */ 1775 { 1776 if (*format == '!') { 1777 format++; 1778 (void) va_arg(*p_va, PyTypeObject*); 1779 (void) va_arg(*p_va, PyObject **); 1780 } 1781 else if (*format == '&') { 1782 typedef int (*converter)(PyObject *, void *); 1783 (void) va_arg(*p_va, converter); 1784 (void) va_arg(*p_va, void *); 1785 format++; 1786 } 1787 else { 1788 (void) va_arg(*p_va, PyObject **); 1789 } 1790 break; 1791 } 1792 1793 case '(': /* bypass tuple, not handled at all previously */ 1794 { 1795 char *msg; 1796 for (;;) { 1797 if (*format==')') 1798 break; 1799 if (IS_END_OF_FORMAT(*format)) 1800 return "Unmatched left paren in format " 1801 "string"; 1802 msg = skipitem(&format, p_va, flags); 1803 if (msg) 1804 return msg; 1805 } 1806 format++; 1807 break; 1808 } 1809 1810 case ')': 1811 return "Unmatched right paren in format string"; 1812 1813 default: 1814 err: 1815 return "impossible<bad format char>"; 1816 1817 } 1818 1819 *p_format = format; 1820 return NULL; 1821 } 1822 1823 1824 int 1825 PyArg_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, ...) 1826 { 1827 Py_ssize_t i, l; 1828 PyObject **o; 1829 va_list vargs; 1830 1831 #ifdef HAVE_STDARG_PROTOTYPES 1832 va_start(vargs, max); 1833 #else 1834 va_start(vargs); 1835 #endif 1836 1837 assert(min >= 0); 1838 assert(min <= max); 1839 if (!PyTuple_Check(args)) { 1840 va_end(vargs); 1841 PyErr_SetString(PyExc_SystemError, 1842 "PyArg_UnpackTuple() argument list is not a tuple"); 1843 return 0; 1844 } 1845 l = PyTuple_GET_SIZE(args); 1846 if (l < min) { 1847 if (name != NULL) 1848 PyErr_Format( 1849 PyExc_TypeError, 1850 "%s expected %s%zd arguments, got %zd", 1851 name, (min == max ? "" : "at least "), min, l); 1852 else 1853 PyErr_Format( 1854 PyExc_TypeError, 1855 "unpacked tuple should have %s%zd elements," 1856 " but has %zd", 1857 (min == max ? "" : "at least "), min, l); 1858 va_end(vargs); 1859 return 0; 1860 } 1861 if (l > max) { 1862 if (name != NULL) 1863 PyErr_Format( 1864 PyExc_TypeError, 1865 "%s expected %s%zd arguments, got %zd", 1866 name, (min == max ? "" : "at most "), max, l); 1867 else 1868 PyErr_Format( 1869 PyExc_TypeError, 1870 "unpacked tuple should have %s%zd elements," 1871 " but has %zd", 1872 (min == max ? "" : "at most "), max, l); 1873 va_end(vargs); 1874 return 0; 1875 } 1876 for (i = 0; i < l; i++) { 1877 o = va_arg(vargs, PyObject **); 1878 *o = PyTuple_GET_ITEM(args, i); 1879 } 1880 va_end(vargs); 1881 return 1; 1882 } 1883 1884 1885 /* For type constructors that don't take keyword args 1886 * 1887 * Sets a TypeError and returns 0 if the kwds dict is 1888 * not empty, returns 1 otherwise 1889 */ 1890 int 1891 _PyArg_NoKeywords(const char *funcname, PyObject *kw) 1892 { 1893 if (kw == NULL) 1894 return 1; 1895 if (!PyDict_CheckExact(kw)) { 1896 PyErr_BadInternalCall(); 1897 return 0; 1898 } 1899 if (PyDict_Size(kw) == 0) 1900 return 1; 1901 1902 PyErr_Format(PyExc_TypeError, "%s does not take keyword arguments", 1903 funcname); 1904 return 0; 1905 } 1906 #ifdef __cplusplus 1907 }; 1908 #endif 1909