PageRenderTime 29ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 0ms

/pypy/module/cpyext/src/getargs.c

https://bitbucket.org/pypy/pypy/
C | 1872 lines | 1577 code | 181 blank | 114 comment | 481 complexity | 8f4e6cd4006be5f7a944f4424d972041 MD5 | raw file
Possible License(s): AGPL-3.0, BSD-3-Clause, Apache-2.0

Large files files are truncated, but you can click here to view the full file

  1. /* New getargs implementation */
  2. #include "Python.h"
  3. #include <ctype.h>
  4. #ifdef __cplusplus
  5. extern "C" {
  6. #endif
  7. int PyArg_Parse(PyObject *, const char *, ...);
  8. int PyArg_ParseTuple(PyObject *, const char *, ...);
  9. int PyArg_VaParse(PyObject *, const char *, va_list);
  10. int PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
  11. const char *, char **, ...);
  12. int PyArg_VaParseTupleAndKeywords(PyObject *, PyObject *,
  13. const char *, char **, va_list);
  14. #define FLAG_COMPAT 1
  15. #define FLAG_SIZE_T 2
  16. /* Forward */
  17. typedef struct freelist_s freelist_t;
  18. static int vgetargs1(PyObject *, const char *, va_list *, int);
  19. static void seterror(int, const char *, int *, const char *, const char *);
  20. static char *convertitem(PyObject *, const char **, va_list *, int, int *,
  21. char *, size_t, freelist_t **);
  22. static char *converttuple(PyObject *, const char **, va_list *, int,
  23. int *, char *, size_t, int, freelist_t **);
  24. static char *convertsimple(PyObject *, const char **, va_list *, int, char *,
  25. size_t, freelist_t **);
  26. static Py_ssize_t convertbuffer(PyObject *, void **p, char **);
  27. static int getbuffer(PyObject *, Py_buffer *, char**);
  28. static int vgetargskeywords(PyObject *, PyObject *,
  29. const char *, char **, va_list *, int);
  30. static char *skipitem(const char **, va_list *, int);
  31. int
  32. PyArg_Parse(PyObject *args, const char *format, ...)
  33. {
  34. int retval;
  35. va_list va;
  36. va_start(va, format);
  37. retval = vgetargs1(args, format, &va, FLAG_COMPAT);
  38. va_end(va);
  39. return retval;
  40. }
  41. int
  42. _PyArg_Parse_SizeT(PyObject *args, const char *format, ...)
  43. {
  44. int retval;
  45. va_list va;
  46. va_start(va, format);
  47. retval = vgetargs1(args, format, &va, FLAG_COMPAT|FLAG_SIZE_T);
  48. va_end(va);
  49. return retval;
  50. }
  51. int
  52. PyArg_ParseTuple(PyObject *args, const char *format, ...)
  53. {
  54. int retval;
  55. va_list va;
  56. va_start(va, format);
  57. retval = vgetargs1(args, format, &va, 0);
  58. va_end(va);
  59. return retval;
  60. }
  61. int
  62. _PyArg_ParseTuple_SizeT(PyObject *args, const char *format, ...)
  63. {
  64. int retval;
  65. va_list va;
  66. va_start(va, format);
  67. retval = vgetargs1(args, format, &va, FLAG_SIZE_T);
  68. va_end(va);
  69. return retval;
  70. }
  71. int
  72. PyArg_VaParse(PyObject *args, const char *format, va_list va)
  73. {
  74. va_list lva;
  75. #ifdef VA_LIST_IS_ARRAY
  76. memcpy(lva, va, sizeof(va_list));
  77. #else
  78. #ifdef __va_copy
  79. __va_copy(lva, va);
  80. #else
  81. lva = va;
  82. #endif
  83. #endif
  84. return vgetargs1(args, format, &lva, 0);
  85. }
  86. int
  87. _PyArg_VaParse_SizeT(PyObject *args, const char *format, va_list va)
  88. {
  89. va_list lva;
  90. #ifdef VA_LIST_IS_ARRAY
  91. memcpy(lva, va, sizeof(va_list));
  92. #else
  93. #ifdef __va_copy
  94. __va_copy(lva, va);
  95. #else
  96. lva = va;
  97. #endif
  98. #endif
  99. return vgetargs1(args, format, &lva, FLAG_SIZE_T);
  100. }
  101. /* Handle cleanup of allocated memory in case of exception */
  102. typedef void (*cleanup_fn)(void *);
  103. struct freelist_s {
  104. void *ptr;
  105. cleanup_fn destr;
  106. struct freelist_s *next;
  107. };
  108. #define cleanup_ptr ((cleanup_fn)PyMem_FREE)
  109. #define cleanup_buffer ((cleanup_fn)PyBuffer_Release)
  110. static int
  111. addcleanup(void *ptr, freelist_t **freelist, cleanup_fn destr)
  112. {
  113. freelist_t *node = PyMem_MALLOC(sizeof(freelist_t));
  114. if (!node) {
  115. destr(ptr);
  116. return -1;
  117. }
  118. node->ptr = ptr;
  119. node->destr = destr;
  120. node->next = *freelist;
  121. *freelist = node;
  122. return 0;
  123. }
  124. static int
  125. cleanreturn(int retval, freelist_t *freelist)
  126. {
  127. freelist_t *next;
  128. while (freelist != NULL) {
  129. if (retval == 0) {
  130. /* Leaving with an error */
  131. freelist->destr(freelist->ptr);
  132. }
  133. next = freelist->next;
  134. PyMem_FREE(freelist);
  135. freelist = next;
  136. }
  137. return retval;
  138. }
  139. static int
  140. vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags)
  141. {
  142. char msgbuf[256];
  143. int levels[32];
  144. const char *fname = NULL;
  145. const char *message = NULL;
  146. int min = -1;
  147. int max = 0;
  148. int level = 0;
  149. int endfmt = 0;
  150. const char *formatsave = format;
  151. Py_ssize_t i, len;
  152. char *msg;
  153. freelist_t *freelist = NULL;
  154. int compat = flags & FLAG_COMPAT;
  155. assert(compat || (args != (PyObject*)NULL));
  156. flags = flags & ~FLAG_COMPAT;
  157. while (endfmt == 0) {
  158. int c = *format++;
  159. switch (c) {
  160. case '(':
  161. if (level == 0)
  162. max++;
  163. level++;
  164. if (level >= 30)
  165. Py_FatalError("too many tuple nesting levels "
  166. "in argument format string");
  167. break;
  168. case ')':
  169. if (level == 0)
  170. Py_FatalError("excess ')' in getargs format");
  171. else
  172. level--;
  173. break;
  174. case '\0':
  175. endfmt = 1;
  176. break;
  177. case ':':
  178. fname = format;
  179. endfmt = 1;
  180. break;
  181. case ';':
  182. message = format;
  183. endfmt = 1;
  184. break;
  185. default:
  186. if (level == 0) {
  187. if (c == 'O')
  188. max++;
  189. else if (isalpha(Py_CHARMASK(c))) {
  190. if (c != 'e') /* skip encoded */
  191. max++;
  192. } else if (c == '|')
  193. min = max;
  194. }
  195. break;
  196. }
  197. }
  198. if (level != 0)
  199. Py_FatalError(/* '(' */ "missing ')' in getargs format");
  200. if (min < 0)
  201. min = max;
  202. format = formatsave;
  203. if (compat) {
  204. if (max == 0) {
  205. if (args == NULL)
  206. return 1;
  207. PyOS_snprintf(msgbuf, sizeof(msgbuf),
  208. "%.200s%s takes no arguments",
  209. fname==NULL ? "function" : fname,
  210. fname==NULL ? "" : "()");
  211. PyErr_SetString(PyExc_TypeError, msgbuf);
  212. return 0;
  213. }
  214. else if (min == 1 && max == 1) {
  215. if (args == NULL) {
  216. PyOS_snprintf(msgbuf, sizeof(msgbuf),
  217. "%.200s%s takes at least one argument",
  218. fname==NULL ? "function" : fname,
  219. fname==NULL ? "" : "()");
  220. PyErr_SetString(PyExc_TypeError, msgbuf);
  221. return 0;
  222. }
  223. msg = convertitem(args, &format, p_va, flags, levels,
  224. msgbuf, sizeof(msgbuf), &freelist);
  225. if (msg == NULL)
  226. return cleanreturn(1, freelist);
  227. seterror(levels[0], msg, levels+1, fname, message);
  228. return cleanreturn(0, freelist);
  229. }
  230. else {
  231. PyErr_SetString(PyExc_SystemError,
  232. "old style getargs format uses new features");
  233. return 0;
  234. }
  235. }
  236. if (!PyTuple_Check(args)) {
  237. PyErr_SetString(PyExc_SystemError,
  238. "new style getargs format but argument is not a tuple");
  239. return 0;
  240. }
  241. len = PyTuple_GET_SIZE(args);
  242. if (len < min || max < len) {
  243. if (message == NULL) {
  244. PyOS_snprintf(msgbuf, sizeof(msgbuf),
  245. "%.150s%s takes %s %d argument%s "
  246. "(%ld given)",
  247. fname==NULL ? "function" : fname,
  248. fname==NULL ? "" : "()",
  249. min==max ? "exactly"
  250. : len < min ? "at least" : "at most",
  251. len < min ? min : max,
  252. (len < min ? min : max) == 1 ? "" : "s",
  253. Py_SAFE_DOWNCAST(len, Py_ssize_t, long));
  254. message = msgbuf;
  255. }
  256. PyErr_SetString(PyExc_TypeError, message);
  257. return 0;
  258. }
  259. for (i = 0; i < len; i++) {
  260. if (*format == '|')
  261. format++;
  262. msg = convertitem(PyTuple_GET_ITEM(args, i), &format, p_va,
  263. flags, levels, msgbuf,
  264. sizeof(msgbuf), &freelist);
  265. if (msg) {
  266. seterror(i+1, msg, levels, fname, msg);
  267. return cleanreturn(0, freelist);
  268. }
  269. }
  270. if (*format != '\0' && !isalpha(Py_CHARMASK(*format)) &&
  271. *format != '(' &&
  272. *format != '|' && *format != ':' && *format != ';') {
  273. PyErr_Format(PyExc_SystemError,
  274. "bad format string: %.200s", formatsave);
  275. return cleanreturn(0, freelist);
  276. }
  277. return cleanreturn(1, freelist);
  278. }
  279. static void
  280. seterror(int iarg, const char *msg, int *levels, const char *fname,
  281. const char *message)
  282. {
  283. char buf[512];
  284. int i;
  285. char *p = buf;
  286. if (PyErr_Occurred())
  287. return;
  288. else if (message == NULL) {
  289. if (fname != NULL) {
  290. PyOS_snprintf(p, sizeof(buf), "%.200s() ", fname);
  291. p += strlen(p);
  292. }
  293. if (iarg != 0) {
  294. PyOS_snprintf(p, sizeof(buf) - (p - buf),
  295. "argument %d", iarg);
  296. i = 0;
  297. p += strlen(p);
  298. while (levels[i] > 0 && i < 32 && (int)(p-buf) < 220) {
  299. PyOS_snprintf(p, sizeof(buf) - (p - buf),
  300. ", item %d", levels[i]-1);
  301. p += strlen(p);
  302. i++;
  303. }
  304. }
  305. else {
  306. PyOS_snprintf(p, sizeof(buf) - (p - buf), "argument");
  307. p += strlen(p);
  308. }
  309. PyOS_snprintf(p, sizeof(buf) - (p - buf), " %.256s", msg);
  310. message = buf;
  311. }
  312. PyErr_SetString(PyExc_TypeError, message);
  313. }
  314. /* Convert a tuple argument.
  315. On entry, *p_format points to the character _after_ the opening '('.
  316. On successful exit, *p_format points to the closing ')'.
  317. If successful:
  318. *p_format and *p_va are updated,
  319. *levels and *msgbuf are untouched,
  320. and NULL is returned.
  321. If the argument is invalid:
  322. *p_format is unchanged,
  323. *p_va is undefined,
  324. *levels is a 0-terminated list of item numbers,
  325. *msgbuf contains an error message, whose format is:
  326. "must be <typename1>, not <typename2>", where:
  327. <typename1> is the name of the expected type, and
  328. <typename2> is the name of the actual type,
  329. and msgbuf is returned.
  330. */
  331. static char *
  332. converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
  333. int *levels, char *msgbuf, size_t bufsize, int toplevel,
  334. freelist_t **freelist)
  335. {
  336. int level = 0;
  337. int n = 0;
  338. const char *format = *p_format;
  339. int i;
  340. for (;;) {
  341. int c = *format++;
  342. if (c == '(') {
  343. if (level == 0)
  344. n++;
  345. level++;
  346. }
  347. else if (c == ')') {
  348. if (level == 0)
  349. break;
  350. level--;
  351. }
  352. else if (c == ':' || c == ';' || c == '\0')
  353. break;
  354. else if (level == 0 && isalpha(Py_CHARMASK(c)))
  355. n++;
  356. }
  357. if (!PySequence_Check(arg) || PyString_Check(arg)) {
  358. levels[0] = 0;
  359. PyOS_snprintf(msgbuf, bufsize,
  360. toplevel ? "expected %d arguments, not %.50s" :
  361. "must be %d-item sequence, not %.50s",
  362. n,
  363. arg == Py_None ? "None" : arg->ob_type->tp_name);
  364. return msgbuf;
  365. }
  366. if ((i = PySequence_Size(arg)) != n) {
  367. levels[0] = 0;
  368. PyOS_snprintf(msgbuf, bufsize,
  369. toplevel ? "expected %d arguments, not %d" :
  370. "must be sequence of length %d, not %d",
  371. n, i);
  372. return msgbuf;
  373. }
  374. format = *p_format;
  375. for (i = 0; i < n; i++) {
  376. char *msg;
  377. PyObject *item;
  378. item = PySequence_GetItem(arg, i);
  379. if (item == NULL) {
  380. PyErr_Clear();
  381. levels[0] = i+1;
  382. levels[1] = 0;
  383. strncpy(msgbuf, "is not retrievable", bufsize);
  384. return msgbuf;
  385. }
  386. //PyPy_Borrow(arg, item);
  387. msg = convertitem(item, &format, p_va, flags, levels+1,
  388. msgbuf, bufsize, freelist);
  389. /* PySequence_GetItem calls tp->sq_item, which INCREFs */
  390. Py_XDECREF(item);
  391. if (msg != NULL) {
  392. levels[0] = i+1;
  393. return msg;
  394. }
  395. }
  396. *p_format = format;
  397. return NULL;
  398. }
  399. /* Convert a single item. */
  400. static char *
  401. convertitem(PyObject *arg, const char **p_format, va_list *p_va, int flags,
  402. int *levels, char *msgbuf, size_t bufsize, freelist_t **freelist)
  403. {
  404. char *msg;
  405. const char *format = *p_format;
  406. if (*format == '(' /* ')' */) {
  407. format++;
  408. msg = converttuple(arg, &format, p_va, flags, levels, msgbuf,
  409. bufsize, 0, freelist);
  410. if (msg == NULL)
  411. format++;
  412. }
  413. else {
  414. msg = convertsimple(arg, &format, p_va, flags,
  415. msgbuf, bufsize, freelist);
  416. if (msg != NULL)
  417. levels[0] = 0;
  418. }
  419. if (msg == NULL)
  420. *p_format = format;
  421. return msg;
  422. }
  423. #define UNICODE_DEFAULT_ENCODING(arg) \
  424. _PyUnicode_AsDefaultEncodedString(arg, NULL)
  425. /* Format an error message generated by convertsimple(). */
  426. static char *
  427. converterr(const char *expected, PyObject *arg, char *msgbuf, size_t bufsize)
  428. {
  429. assert(expected != NULL);
  430. assert(arg != NULL);
  431. PyOS_snprintf(msgbuf, bufsize,
  432. "must be %.50s, not %.50s", expected,
  433. arg == Py_None ? "None" : arg->ob_type->tp_name);
  434. return msgbuf;
  435. }
  436. #define CONV_UNICODE "(unicode conversion error)"
  437. /* explicitly check for float arguments when integers are expected. For now
  438. * signal a warning. Returns true if an exception was raised. */
  439. static int
  440. float_argument_warning(PyObject *arg)
  441. {
  442. if (PyFloat_Check(arg) &&
  443. PyErr_Warn(PyExc_DeprecationWarning,
  444. "integer argument expected, got float" ))
  445. return 1;
  446. else
  447. return 0;
  448. }
  449. /* explicitly check for float arguments when integers are expected. Raises
  450. TypeError and returns true for float arguments. */
  451. static int
  452. float_argument_error(PyObject *arg)
  453. {
  454. if (PyFloat_Check(arg)) {
  455. PyErr_SetString(PyExc_TypeError,
  456. "integer argument expected, got float");
  457. return 1;
  458. }
  459. else
  460. return 0;
  461. }
  462. /* Convert a non-tuple argument. Return NULL if conversion went OK,
  463. or a string with a message describing the failure. The message is
  464. formatted as "must be <desired type>, not <actual type>".
  465. When failing, an exception may or may not have been raised.
  466. Don't call if a tuple is expected.
  467. When you add new format codes, please don't forget poor skipitem() below.
  468. */
  469. static char *
  470. convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
  471. char *msgbuf, size_t bufsize, freelist_t **freelist)
  472. {
  473. /* For # codes */
  474. #define FETCH_SIZE int *q=NULL;Py_ssize_t *q2=NULL;\
  475. if (flags & FLAG_SIZE_T) q2=va_arg(*p_va, Py_ssize_t*); \
  476. else q=va_arg(*p_va, int*);
  477. #define STORE_SIZE(s) \
  478. if (flags & FLAG_SIZE_T) \
  479. *q2=s; \
  480. else { \
  481. if (INT_MAX < s) { \
  482. PyErr_SetString(PyExc_OverflowError, \
  483. "size does not fit in an int"); \
  484. return converterr("", arg, msgbuf, bufsize); \
  485. } \
  486. *q=s; \
  487. }
  488. #define BUFFER_LEN ((flags & FLAG_SIZE_T) ? *q2:*q)
  489. const char *format = *p_format;
  490. char c = *format++;
  491. #ifdef Py_USING_UNICODE
  492. PyObject *uarg;
  493. #endif
  494. switch (c) {
  495. case 'b': { /* unsigned byte -- very short int */
  496. char *p = va_arg(*p_va, char *);
  497. long ival;
  498. if (float_argument_error(arg))
  499. return converterr("integer<b>", arg, msgbuf, bufsize);
  500. ival = PyInt_AsLong(arg);
  501. if (ival == -1 && PyErr_Occurred())
  502. return converterr("integer<b>", arg, msgbuf, bufsize);
  503. else if (ival < 0) {
  504. PyErr_SetString(PyExc_OverflowError,
  505. "unsigned byte integer is less than minimum");
  506. return converterr("integer<b>", arg, msgbuf, bufsize);
  507. }
  508. else if (ival > UCHAR_MAX) {
  509. PyErr_SetString(PyExc_OverflowError,
  510. "unsigned byte integer is greater than maximum");
  511. return converterr("integer<b>", arg, msgbuf, bufsize);
  512. }
  513. else
  514. *p = (unsigned char) ival;
  515. break;
  516. }
  517. case 'B': {/* byte sized bitfield - both signed and unsigned
  518. values allowed */
  519. char *p = va_arg(*p_va, char *);
  520. long ival;
  521. if (float_argument_error(arg))
  522. return converterr("integer<B>", arg, msgbuf, bufsize);
  523. ival = PyInt_AsUnsignedLongMask(arg);
  524. if (ival == -1 && PyErr_Occurred())
  525. return converterr("integer<B>", arg, msgbuf, bufsize);
  526. else
  527. *p = (unsigned char) ival;
  528. break;
  529. }
  530. case 'h': {/* signed short int */
  531. short *p = va_arg(*p_va, short *);
  532. long ival;
  533. if (float_argument_error(arg))
  534. return converterr("integer<h>", arg, msgbuf, bufsize);
  535. ival = PyInt_AsLong(arg);
  536. if (ival == -1 && PyErr_Occurred())
  537. return converterr("integer<h>", arg, msgbuf, bufsize);
  538. else if (ival < SHRT_MIN) {
  539. PyErr_SetString(PyExc_OverflowError,
  540. "signed short integer is less than minimum");
  541. return converterr("integer<h>", arg, msgbuf, bufsize);
  542. }
  543. else if (ival > SHRT_MAX) {
  544. PyErr_SetString(PyExc_OverflowError,
  545. "signed short integer is greater than maximum");
  546. return converterr("integer<h>", arg, msgbuf, bufsize);
  547. }
  548. else
  549. *p = (short) ival;
  550. break;
  551. }
  552. case 'H': { /* short int sized bitfield, both signed and
  553. unsigned allowed */
  554. unsigned short *p = va_arg(*p_va, unsigned short *);
  555. long ival;
  556. if (float_argument_error(arg))
  557. return converterr("integer<H>", arg, msgbuf, bufsize);
  558. ival = PyInt_AsUnsignedLongMask(arg);
  559. if (ival == -1 && PyErr_Occurred())
  560. return converterr("integer<H>", arg, msgbuf, bufsize);
  561. else
  562. *p = (unsigned short) ival;
  563. break;
  564. }
  565. case 'i': {/* signed int */
  566. int *p = va_arg(*p_va, int *);
  567. long ival;
  568. if (float_argument_error(arg))
  569. return converterr("integer<i>", arg, msgbuf, bufsize);
  570. ival = PyInt_AsLong(arg);
  571. if (ival == -1 && PyErr_Occurred())
  572. return converterr("integer<i>", arg, msgbuf, bufsize);
  573. else if (ival > INT_MAX) {
  574. PyErr_SetString(PyExc_OverflowError,
  575. "signed integer is greater than maximum");
  576. return converterr("integer<i>", arg, msgbuf, bufsize);
  577. }
  578. else if (ival < INT_MIN) {
  579. PyErr_SetString(PyExc_OverflowError,
  580. "signed integer is less than minimum");
  581. return converterr("integer<i>", arg, msgbuf, bufsize);
  582. }
  583. else
  584. *p = ival;
  585. break;
  586. }
  587. case 'I': { /* int sized bitfield, both signed and
  588. unsigned allowed */
  589. unsigned int *p = va_arg(*p_va, unsigned int *);
  590. unsigned int ival;
  591. if (float_argument_error(arg))
  592. return converterr("integer<I>", arg, msgbuf, bufsize);
  593. ival = (unsigned int)PyInt_AsUnsignedLongMask(arg);
  594. if (ival == (unsigned int)-1 && PyErr_Occurred())
  595. return converterr("integer<I>", arg, msgbuf, bufsize);
  596. else
  597. *p = ival;
  598. break;
  599. }
  600. case 'n': /* Py_ssize_t */
  601. #if SIZEOF_SIZE_T != SIZEOF_LONG
  602. {
  603. Py_ssize_t *p = va_arg(*p_va, Py_ssize_t *);
  604. Py_ssize_t ival;
  605. if (float_argument_error(arg))
  606. return converterr("integer<n>", arg, msgbuf, bufsize);
  607. ival = PyInt_AsSsize_t(arg);
  608. if (ival == -1 && PyErr_Occurred())
  609. return converterr("integer<n>", arg, msgbuf, bufsize);
  610. *p = ival;
  611. break;
  612. }
  613. #endif
  614. /* Fall through from 'n' to 'l' if Py_ssize_t is int */
  615. case 'l': {/* long int */
  616. long *p = va_arg(*p_va, long *);
  617. long ival;
  618. if (float_argument_error(arg))
  619. return converterr("integer<l>", arg, msgbuf, bufsize);
  620. ival = PyInt_AsLong(arg);
  621. if (ival == -1 && PyErr_Occurred())
  622. return converterr("integer<l>", arg, msgbuf, bufsize);
  623. else
  624. *p = ival;
  625. break;
  626. }
  627. case 'k': { /* long sized bitfield */
  628. unsigned long *p = va_arg(*p_va, unsigned long *);
  629. unsigned long ival;
  630. if (PyInt_Check(arg))
  631. ival = PyInt_AsUnsignedLongMask(arg);
  632. else if (PyLong_Check(arg))
  633. ival = PyLong_AsUnsignedLongMask(arg);
  634. else
  635. return converterr("integer<k>", arg, msgbuf, bufsize);
  636. *p = ival;
  637. break;
  638. }
  639. #ifdef HAVE_LONG_LONG
  640. case 'L': {/* PY_LONG_LONG */
  641. PY_LONG_LONG *p = va_arg( *p_va, PY_LONG_LONG * );
  642. PY_LONG_LONG ival;
  643. if (float_argument_warning(arg))
  644. return converterr("long<L>", arg, msgbuf, bufsize);
  645. ival = PyLong_AsLongLong(arg);
  646. if (ival == (PY_LONG_LONG)-1 && PyErr_Occurred() ) {
  647. return converterr("long<L>", arg, msgbuf, bufsize);
  648. } else {
  649. *p = ival;
  650. }
  651. break;
  652. }
  653. case 'K': { /* long long sized bitfield */
  654. unsigned PY_LONG_LONG *p = va_arg(*p_va, unsigned PY_LONG_LONG *);
  655. unsigned PY_LONG_LONG ival;
  656. if (PyInt_Check(arg))
  657. ival = PyInt_AsUnsignedLongMask(arg);
  658. else if (PyLong_Check(arg))
  659. ival = PyLong_AsUnsignedLongLongMask(arg);
  660. else
  661. return converterr("integer<K>", arg, msgbuf, bufsize);
  662. *p = ival;
  663. break;
  664. }
  665. #endif
  666. case 'f': {/* float */
  667. float *p = va_arg(*p_va, float *);
  668. double dval = PyFloat_AsDouble(arg);
  669. if (PyErr_Occurred())
  670. return converterr("float<f>", arg, msgbuf, bufsize);
  671. else
  672. *p = (float) dval;
  673. break;
  674. }
  675. case 'd': {/* double */
  676. double *p = va_arg(*p_va, double *);
  677. double dval = PyFloat_AsDouble(arg);
  678. if (PyErr_Occurred())
  679. return converterr("float<d>", arg, msgbuf, bufsize);
  680. else
  681. *p = dval;
  682. break;
  683. }
  684. #ifndef WITHOUT_COMPLEX
  685. case 'D': {/* complex double */
  686. Py_complex *p = va_arg(*p_va, Py_complex *);
  687. Py_complex cval;
  688. cval = PyComplex_AsCComplex(arg);
  689. if (PyErr_Occurred())
  690. return converterr("complex<D>", arg, msgbuf, bufsize);
  691. else
  692. *p = cval;
  693. break;
  694. }
  695. #endif /* WITHOUT_COMPLEX */
  696. case 'c': {/* char */
  697. char *p = va_arg(*p_va, char *);
  698. if (PyString_Check(arg) && PyString_Size(arg) == 1)
  699. *p = PyString_AS_STRING(arg)[0];
  700. else
  701. return converterr("char", arg, msgbuf, bufsize);
  702. break;
  703. }
  704. case 's': {/* string */
  705. if (*format == '*') {
  706. Py_buffer *p = (Py_buffer *)va_arg(*p_va, Py_buffer *);
  707. if (PyString_Check(arg)) {
  708. PyBuffer_FillInfo(p, arg,
  709. PyString_AS_STRING(arg), PyString_GET_SIZE(arg),
  710. 1, 0);
  711. }
  712. #ifdef Py_USING_UNICODE
  713. else if (PyUnicode_Check(arg)) {
  714. uarg = UNICODE_DEFAULT_ENCODING(arg);
  715. if (uarg == NULL)
  716. return converterr(CONV_UNICODE,
  717. arg, msgbuf, bufsize);
  718. PyBuffer_FillInfo(p, arg,
  719. PyString_AS_STRING(uarg), PyString_GET_SIZE(uarg),
  720. 1, 0);
  721. }
  722. #endif
  723. else { /* any buffer-like object */
  724. char *buf;
  725. if (getbuffer(arg, p, &buf) < 0)
  726. return converterr(buf, arg, msgbuf, bufsize);
  727. }
  728. if (addcleanup(p, freelist, cleanup_buffer)) {
  729. return converterr(
  730. "(cleanup problem)",
  731. arg, msgbuf, bufsize);
  732. }
  733. format++;
  734. } else if (*format == '#') {
  735. void **p = (void **)va_arg(*p_va, char **);
  736. FETCH_SIZE;
  737. if (PyString_Check(arg)) {
  738. *p = PyString_AS_STRING(arg);
  739. STORE_SIZE(PyString_GET_SIZE(arg));
  740. }
  741. #ifdef Py_USING_UNICODE
  742. else if (PyUnicode_Check(arg)) {
  743. uarg = UNICODE_DEFAULT_ENCODING(arg);
  744. if (uarg == NULL)
  745. return converterr(CONV_UNICODE,
  746. arg, msgbuf, bufsize);
  747. *p = PyString_AS_STRING(uarg);
  748. STORE_SIZE(PyString_GET_SIZE(uarg));
  749. }
  750. #endif
  751. else { /* any buffer-like object */
  752. char *buf;
  753. Py_ssize_t count = convertbuffer(arg, p, &buf);
  754. if (count < 0)
  755. return converterr(buf, arg, msgbuf, bufsize);
  756. STORE_SIZE(count);
  757. }
  758. format++;
  759. } else {
  760. char **p = va_arg(*p_va, char **);
  761. if (PyString_Check(arg))
  762. *p = PyString_AS_STRING(arg);
  763. #ifdef Py_USING_UNICODE
  764. else if (PyUnicode_Check(arg)) {
  765. uarg = UNICODE_DEFAULT_ENCODING(arg);
  766. if (uarg == NULL)
  767. return converterr(CONV_UNICODE,
  768. arg, msgbuf, bufsize);
  769. *p = PyString_AS_STRING(uarg);
  770. }
  771. #endif
  772. else
  773. return converterr("string", arg, msgbuf, bufsize);
  774. if ((Py_ssize_t)strlen(*p) != PyString_Size(arg))
  775. return converterr("string without null bytes",
  776. arg, msgbuf, bufsize);
  777. }
  778. break;
  779. }
  780. case 'z': {/* string, may be NULL (None) */
  781. if (*format == '*') {
  782. Py_buffer *p = (Py_buffer *)va_arg(*p_va, Py_buffer *);
  783. if (arg == Py_None)
  784. PyBuffer_FillInfo(p, NULL, NULL, 0, 1, 0);
  785. else if (PyString_Check(arg)) {
  786. PyBuffer_FillInfo(p, arg,
  787. PyString_AS_STRING(arg), PyString_GET_SIZE(arg),
  788. 1, 0);
  789. }
  790. #ifdef Py_USING_UNICODE
  791. else if (PyUnicode_Check(arg)) {
  792. uarg = UNICODE_DEFAULT_ENCODING(arg);
  793. if (uarg == NULL)
  794. return converterr(CONV_UNICODE,
  795. arg, msgbuf, bufsize);
  796. PyBuffer_FillInfo(p, arg,
  797. PyString_AS_STRING(uarg), PyString_GET_SIZE(uarg),
  798. 1, 0);
  799. }
  800. #endif
  801. else { /* any buffer-like object */
  802. char *buf;
  803. if (getbuffer(arg, p, &buf) < 0)
  804. return converterr(buf, arg, msgbuf, bufsize);
  805. }
  806. if (addcleanup(p, freelist, cleanup_buffer)) {
  807. return converterr(
  808. "(cleanup problem)",
  809. arg, msgbuf, bufsize);
  810. }
  811. format++;
  812. } else if (*format == '#') { /* any buffer-like object */
  813. void **p = (void **)va_arg(*p_va, char **);
  814. FETCH_SIZE;
  815. if (arg == Py_None) {
  816. *p = 0;
  817. STORE_SIZE(0);
  818. }
  819. else if (PyString_Check(arg)) {
  820. *p = PyString_AS_STRING(arg);
  821. STORE_SIZE(PyString_GET_SIZE(arg));
  822. }
  823. #ifdef Py_USING_UNICODE
  824. else if (PyUnicode_Check(arg)) {
  825. uarg = UNICODE_DEFAULT_ENCODING(arg);
  826. if (uarg == NULL)
  827. return converterr(CONV_UNICODE,
  828. arg, msgbuf, bufsize);
  829. *p = PyString_AS_STRING(uarg);
  830. STORE_SIZE(PyString_GET_SIZE(uarg));
  831. }
  832. #endif
  833. else { /* any buffer-like object */
  834. char *buf;
  835. Py_ssize_t count = convertbuffer(arg, p, &buf);
  836. if (count < 0)
  837. return converterr(buf, arg, msgbuf, bufsize);
  838. STORE_SIZE(count);
  839. }
  840. format++;
  841. } else {
  842. char **p = va_arg(*p_va, char **);
  843. if (arg == Py_None)
  844. *p = 0;
  845. else if (PyString_Check(arg))
  846. *p = PyString_AS_STRING(arg);
  847. #ifdef Py_USING_UNICODE
  848. else if (PyUnicode_Check(arg)) {
  849. uarg = UNICODE_DEFAULT_ENCODING(arg);
  850. if (uarg == NULL)
  851. return converterr(CONV_UNICODE,
  852. arg, msgbuf, bufsize);
  853. *p = PyString_AS_STRING(uarg);
  854. }
  855. #endif
  856. else
  857. return converterr("string or None",
  858. arg, msgbuf, bufsize);
  859. if (*format == '#') {
  860. FETCH_SIZE;
  861. assert(0); /* XXX redundant with if-case */
  862. if (arg == Py_None) {
  863. STORE_SIZE(0);
  864. } else {
  865. STORE_SIZE(PyString_Size(arg));
  866. }
  867. format++;
  868. }
  869. else if (*p != NULL &&
  870. (Py_ssize_t)strlen(*p) != PyString_Size(arg))
  871. return converterr(
  872. "string without null bytes or None",
  873. arg, msgbuf, bufsize);
  874. }
  875. break;
  876. }
  877. case 'e': {/* encoded string */
  878. char **buffer;
  879. const char *encoding;
  880. PyObject *s;
  881. Py_ssize_t size;
  882. int recode_strings;
  883. /* Get 'e' parameter: the encoding name */
  884. encoding = (const char *)va_arg(*p_va, const char *);
  885. #ifdef Py_USING_UNICODE
  886. if (encoding == NULL)
  887. encoding = PyUnicode_GetDefaultEncoding();
  888. #endif
  889. /* Get output buffer parameter:
  890. 's' (recode all objects via Unicode) or
  891. 't' (only recode non-string objects)
  892. */
  893. if (*format == 's')
  894. recode_strings = 1;
  895. else if (*format == 't')
  896. recode_strings = 0;
  897. else
  898. return converterr(
  899. "(unknown parser marker combination)",
  900. arg, msgbuf, bufsize);
  901. buffer = (char **)va_arg(*p_va, char **);
  902. format++;
  903. if (buffer == NULL)
  904. return converterr("(buffer is NULL)",
  905. arg, msgbuf, bufsize);
  906. /* Encode object */
  907. if (!recode_strings && PyString_Check(arg)) {
  908. s = arg;
  909. Py_INCREF(s);
  910. }
  911. else {
  912. #ifdef Py_USING_UNICODE
  913. PyObject *u;
  914. /* Convert object to Unicode */
  915. u = PyUnicode_FromObject(arg);
  916. if (u == NULL)
  917. return converterr(
  918. "string or unicode or text buffer",
  919. arg, msgbuf, bufsize);
  920. /* Encode object; use default error handling */
  921. s = PyUnicode_AsEncodedString(u,
  922. encoding,
  923. NULL);
  924. Py_DECREF(u);
  925. if (s == NULL)
  926. return converterr("(encoding failed)",
  927. arg, msgbuf, bufsize);
  928. if (!PyString_Check(s)) {
  929. Py_DECREF(s);
  930. return converterr(
  931. "(encoder failed to return a string)",
  932. arg, msgbuf, bufsize);
  933. }
  934. #else
  935. return converterr("string<e>", arg, msgbuf, bufsize);
  936. #endif
  937. }
  938. size = PyString_GET_SIZE(s);
  939. /* Write output; output is guaranteed to be 0-terminated */
  940. if (*format == '#') {
  941. /* Using buffer length parameter '#':
  942. - if *buffer is NULL, a new buffer of the
  943. needed size is allocated and the data
  944. copied into it; *buffer is updated to point
  945. to the new buffer; the caller is
  946. responsible for PyMem_Free()ing it after
  947. usage
  948. - if *buffer is not NULL, the data is
  949. copied to *buffer; *buffer_len has to be
  950. set to the size of the buffer on input;
  951. buffer overflow is signalled with an error;
  952. buffer has to provide enough room for the
  953. encoded string plus the trailing 0-byte
  954. - in both cases, *buffer_len is updated to
  955. the size of the buffer /excluding/ the
  956. trailing 0-byte
  957. */
  958. FETCH_SIZE;
  959. format++;
  960. if (q == NULL && q2 == NULL) {
  961. Py_DECREF(s);
  962. return converterr(
  963. "(buffer_len is NULL)",
  964. arg, msgbuf, bufsize);
  965. }
  966. if (*buffer == NULL) {
  967. *buffer = PyMem_NEW(char, size + 1);
  968. if (*buffer == NULL) {
  969. Py_DECREF(s);
  970. return converterr(
  971. "(memory error)",
  972. arg, msgbuf, bufsize);
  973. }
  974. if (addcleanup(*buffer, freelist, cleanup_ptr)) {
  975. Py_DECREF(s);
  976. return converterr(
  977. "(cleanup problem)",
  978. arg, msgbuf, bufsize);
  979. }
  980. } else {
  981. if (size + 1 > BUFFER_LEN) {
  982. Py_DECREF(s);
  983. return converterr(
  984. "(buffer overflow)",
  985. arg, msgbuf, bufsize);
  986. }
  987. }
  988. memcpy(*buffer,
  989. PyString_AS_STRING(s),
  990. size + 1);
  991. STORE_SIZE(size);
  992. } else {
  993. /* Using a 0-terminated buffer:
  994. - the encoded string has to be 0-terminated
  995. for this variant to work; if it is not, an
  996. error raised
  997. - a new buffer of the needed size is
  998. allocated and the data copied into it;
  999. *buffer is updated to point to the new
  1000. buffer; the caller is responsible for
  1001. PyMem_Free()ing it after usage
  1002. */
  1003. if ((Py_ssize_t)strlen(PyString_AS_STRING(s))
  1004. != size) {
  1005. Py_DECREF(s);
  1006. return converterr(
  1007. "encoded string without NULL bytes",
  1008. arg, msgbuf, bufsize);
  1009. }
  1010. *buffer = PyMem_NEW(char, size + 1);
  1011. if (*buffer == NULL) {
  1012. Py_DECREF(s);
  1013. return converterr("(memory error)",
  1014. arg, msgbuf, bufsize);
  1015. }
  1016. if (addcleanup(*buffer, freelist, cleanup_ptr)) {
  1017. Py_DECREF(s);
  1018. return converterr("(cleanup problem)",
  1019. arg, msgbuf, bufsize);
  1020. }
  1021. memcpy(*buffer,
  1022. PyString_AS_STRING(s),
  1023. size + 1);
  1024. }
  1025. Py_DECREF(s);
  1026. break;
  1027. }
  1028. #ifdef Py_USING_UNICODE
  1029. case 'u': {/* raw unicode buffer (Py_UNICODE *) */
  1030. if (*format == '#') { /* any buffer-like object */
  1031. void **p = (void **)va_arg(*p_va, char **);
  1032. FETCH_SIZE;
  1033. if (PyUnicode_Check(arg)) {
  1034. *p = PyUnicode_AS_UNICODE(arg);
  1035. STORE_SIZE(PyUnicode_GET_SIZE(arg));
  1036. }
  1037. else {
  1038. return converterr("cannot convert raw buffers",
  1039. arg, msgbuf, bufsize);
  1040. }
  1041. format++;
  1042. } else {
  1043. Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
  1044. if (PyUnicode_Check(arg))
  1045. *p = PyUnicode_AS_UNICODE(arg);
  1046. else
  1047. return converterr("unicode", arg, msgbuf, bufsize);
  1048. }
  1049. break;
  1050. }
  1051. #endif
  1052. case 'S': { /* string object */
  1053. PyObject **p = va_arg(*p_va, PyObject **);
  1054. if (PyString_Check(arg))
  1055. *p = arg;
  1056. else
  1057. return converterr("string", arg, msgbuf, bufsize);
  1058. break;
  1059. }
  1060. #ifdef Py_USING_UNICODE
  1061. case 'U': { /* Unicode object */
  1062. PyObject **p = va_arg(*p_va, PyObject **);
  1063. if (PyUnicode_Check(arg))
  1064. *p = arg;
  1065. else
  1066. return converterr("unicode", arg, msgbuf, bufsize);
  1067. break;
  1068. }
  1069. #endif
  1070. case 'O': { /* object */
  1071. PyTypeObject *type;
  1072. PyObject **p;
  1073. if (*format == '!') {
  1074. type = va_arg(*p_va, PyTypeObject*);
  1075. p = va_arg(*p_va, PyObject **);
  1076. format++;
  1077. if (PyType_IsSubtype(arg->ob_type, type))
  1078. *p = arg;
  1079. else
  1080. return converterr(type->tp_name, arg, msgbuf, bufsize);
  1081. }
  1082. else if (*format == '?') {
  1083. inquiry pred = va_arg(*p_va, inquiry);
  1084. p = va_arg(*p_va, PyObject **);
  1085. format++;
  1086. if ((*pred)(arg))
  1087. *p = arg;
  1088. else
  1089. return converterr("(unspecified)",
  1090. arg, msgbuf, bufsize);
  1091. }
  1092. else if (*format == '&') {
  1093. typedef int (*converter)(PyObject *, void *);
  1094. converter convert = va_arg(*p_va, converter);
  1095. void *addr = va_arg(*p_va, void *);
  1096. format++;
  1097. if (! (*convert)(arg, addr))
  1098. return converterr("(unspecified)",
  1099. arg, msgbuf, bufsize);
  1100. }
  1101. else {
  1102. p = va_arg(*p_va, PyObject **);
  1103. *p = arg;
  1104. }
  1105. break;
  1106. }
  1107. case 'w': { /* memory buffer, read-write access */
  1108. void **p = va_arg(*p_va, void **);
  1109. void *res;
  1110. PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
  1111. Py_ssize_t count;
  1112. if (pb && pb->bf_releasebuffer && *format != '*')
  1113. /* Buffer must be released, yet caller does not use
  1114. the Py_buffer protocol. */
  1115. return converterr("pinned buffer", arg, msgbuf, bufsize);
  1116. if (pb && pb->bf_getbuffer && *format == '*') {
  1117. /* Caller is interested in Py_buffer, and the object
  1118. supports it directly. */
  1119. format++;
  1120. if (pb->bf_getbuffer(arg, (Py_buffer*)p, PyBUF_WRITABLE) < 0) {
  1121. PyErr_Clear();
  1122. return converterr("read-write buffer", arg, msgbuf, bufsize);
  1123. }
  1124. if (addcleanup(p, freelist, cleanup_buffer)) {
  1125. return converterr(
  1126. "(cleanup problem)",
  1127. arg, msgbuf, bufsize);
  1128. }
  1129. if (!PyBuffer_IsContiguous((Py_buffer*)p, 'C'))
  1130. return converterr("contiguous buffer", arg, msgbuf, bufsize);
  1131. break;
  1132. }
  1133. if (pb == NULL ||
  1134. pb->bf_getwritebuffer == NULL ||
  1135. pb->bf_getsegcount == NULL)
  1136. return converterr("read-write buffer", arg, msgbuf, bufsize);
  1137. if ((*pb->bf_getsegcount)(arg, NULL) != 1)
  1138. return converterr("single-segment read-write buffer",
  1139. arg, msgbuf, bufsize);
  1140. if ((count = pb->bf_getwritebuffer(arg, 0, &res)) < 0)
  1141. return converterr("(unspecified)", arg, msgbuf, bufsize);
  1142. if (*format == '*') {
  1143. PyBuffer_FillInfo((Py_buffer*)p, arg, res, count, 1, 0);
  1144. format++;
  1145. }
  1146. else {
  1147. *p = res;
  1148. if (*format == '#') {
  1149. FETCH_SIZE;
  1150. STORE_SIZE(count);
  1151. format++;
  1152. }
  1153. }
  1154. break;
  1155. }
  1156. case 't': { /* 8-bit character buffer, read-only access */
  1157. char **p = va_arg(*p_va, char **);
  1158. PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
  1159. Py_ssize_t count;
  1160. if (*format++ != '#')
  1161. return converterr(
  1162. "invalid use of 't' format character",
  1163. arg, msgbuf, bufsize);
  1164. if (!PyType_HasFeature(arg->ob_type,
  1165. Py_TPFLAGS_HAVE_GETCHARBUFFER) ||
  1166. pb == NULL || pb->bf_getcharbuffer == NULL ||
  1167. pb->bf_getsegcount == NULL)
  1168. return converterr(
  1169. "string or read-only character buffer",
  1170. arg, msgbuf, bufsize);
  1171. if (pb->bf_getsegcount(arg, NULL) != 1)
  1172. return converterr(
  1173. "string or single-segment read-only buffer",
  1174. arg, msgbuf, bufsize);
  1175. if (pb->bf_releasebuffer)
  1176. return converterr(
  1177. "string or pinned buffer",
  1178. arg, msgbuf, bufsize);
  1179. count = pb->bf_getcharbuffer(arg, 0, p);
  1180. if (count < 0)
  1181. return converterr("(unspecified)", arg, msgbuf, bufsize);
  1182. {
  1183. FETCH_SIZE;
  1184. STORE_SIZE(count);
  1185. }
  1186. break;
  1187. }
  1188. default:
  1189. return converterr("impossible<bad format char>", arg, msgbuf, bufsize);
  1190. }
  1191. *p_format = format;
  1192. return NULL;
  1193. }
  1194. static Py_ssize_t
  1195. convertbuffer(PyObject *arg, void **p, char **errmsg)
  1196. {
  1197. PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
  1198. Py_ssize_t count;
  1199. if (pb == NULL ||
  1200. pb->bf_getreadbuffer == NULL ||
  1201. pb->bf_getsegcount == NULL ||
  1202. pb->bf_releasebuffer != NULL) {
  1203. *errmsg = "string or read-only buffer";
  1204. return -1;
  1205. }
  1206. if ((*pb->bf_getsegcount)(arg, NULL) != 1) {
  1207. *errmsg = "string or single-segment read-only buffer";
  1208. return -1;
  1209. }
  1210. if ((count = (*pb->bf_getreadbuffer)(arg, 0, p)) < 0) {
  1211. *errmsg = "(unspecified)";
  1212. }
  1213. return count;
  1214. }
  1215. static int
  1216. getbuffer(PyObject *arg, Py_buffer *view, char **errmsg)
  1217. {
  1218. void *buf;
  1219. Py_ssize_t count;
  1220. PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
  1221. if (pb == NULL) {
  1222. *errmsg = "string or buffer";
  1223. return -1;
  1224. }
  1225. if (pb->bf_getbuffer) {
  1226. if (pb->bf_getbuffer(arg, view, 0) < 0) {
  1227. *errmsg = "convertible to a buffer";
  1228. return -1;
  1229. }
  1230. if (!PyBuffer_IsContiguous(view, 'C')) {
  1231. *errmsg = "contiguous buffer";
  1232. return -1;
  1233. }
  1234. return 0;
  1235. }
  1236. count = convertbuffer(arg, &buf, errmsg);
  1237. if (count < 0) {
  1238. *errmsg = "convertible to a buffer";
  1239. return count;
  1240. }
  1241. PyBuffer_FillInfo(view, arg, buf, count, 1, 0);
  1242. return 0;
  1243. }
  1244. /* Support for keyword arguments donated by
  1245. Geoff Philbrick <philbric@delphi.hks.com> */
  1246. /* Return false (0) for error, else true. */
  1247. int
  1248. PyArg_ParseTupleAndKeywords(PyObject *args,
  1249. PyObject *keywords,
  1250. const char *format,
  1251. char **kwlist, ...)
  1252. {
  1253. int retval;
  1254. va_list va;
  1255. if ((args == NULL || !PyTuple_Check(args)) ||
  1256. (keywords != NULL && !PyDict_Check(keywords)) ||
  1257. format == NULL ||
  1258. kwlist == NULL)
  1259. {
  1260. PyErr_BadInternalCall();
  1261. return 0;
  1262. }
  1263. va_start(va, kwlist);
  1264. retval = vgetargskeywords(args, keywords, format, kwlist, &va, 0);
  1265. va_end(va);
  1266. return retval;
  1267. }
  1268. int
  1269. _PyArg_ParseTupleAndKeywords_SizeT(PyObject *args,
  1270. PyObject *keywords,
  1271. const char *format,
  1272. char **kwlist, ...)
  1273. {
  1274. int retval;
  1275. va_list va;
  1276. if ((args == NULL || !PyTuple_Check(args)) ||
  1277. (keywords != NULL && !PyDict_Check(keywords)) ||
  1278. format == NULL ||
  1279. kwlist == NULL)
  1280. {
  1281. PyErr_BadInternalCall();
  1282. return 0;
  1283. }
  1284. va_start(va, kwlist);
  1285. retval = vgetargskeywords(args, keywords, format,
  1286. kwlist, &va, FLAG_SIZE_T);
  1287. va_end(va);
  1288. return retval;
  1289. }
  1290. int
  1291. PyArg_VaParseTupleAndKeywords(PyObject *args,
  1292. PyObject *keywords,
  1293. const char *format,
  1294. char **kwlist, va_list va)
  1295. {
  1296. int retval;
  1297. va_list lva;
  1298. if ((args == NULL || !PyTuple_Check(args)) ||
  1299. (keywords != NULL && !PyDict_Check(keywords)) ||
  1300. format == NULL ||
  1301. kwlist == NULL)
  1302. {
  1303. PyErr_BadInternalCall();
  1304. return 0;
  1305. }
  1306. #ifdef VA_LIST_IS_ARRAY
  1307. memcpy(lva, va, sizeof(va_list));
  1308. #else
  1309. #ifdef __va_copy
  1310. __va_copy(lva, va);
  1311. #else
  1312. lva = va;
  1313. #endif
  1314. #endif
  1315. retval = vgetargskeywords(args, keywords, format, kwlist, &lva, 0);
  1316. return retval;
  1317. }
  1318. int
  1319. _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *args,
  1320. PyObject *keywords,
  1321. const char *format,
  1322. char **kwlist, va_list va)
  1323. {
  1324. int retval;
  1325. va_list lva;
  1326. if ((args == NULL || !PyTuple_Check(args)) ||
  1327. (keywords != NULL && !PyDict_Check(keywords)) ||
  1328. format == NULL ||
  1329. kwlist == NULL)
  1330. {
  1331. PyErr_BadInternalCall();
  1332. return 0;
  1333. }
  1334. #ifdef VA_LIST_IS_ARRAY
  1335. memcpy(lva, va, sizeof(va_list));
  1336. #else
  1337. #ifdef __va_copy
  1338. __va_copy(lva, va);
  1339. #else
  1340. lva = va;
  1341. #endif
  1342. #endif
  1343. retval = vgetargskeywords(args, keywords, format,
  1344. kwlist, &lva, FLAG_SIZE_T);
  1345. return retval;
  1346. }
  1347. #define IS_END_OF_FORMAT(c) (c == '\0' || c == ';' || c == ':')
  1348. static int
  1349. vgetargskeywords(PyObject *args, PyObject *keywords, const char *format,
  1350. char **kwlist, va_list *p_va, int flags)
  1351. {
  1352. char msgbuf[512];
  1353. int levels[32];
  1354. const char *fname, *msg, *custom_msg, *keyword;
  1355. int min = INT_MAX;
  1356. int i, len, nargs, nkeywords;
  1357. freelist_t *freelist = NULL;
  1358. PyObject *current_arg;
  1359. assert(args != NULL && PyTuple_Check(args));
  1360. assert(keywords == NULL || PyDict_Check(keywords));
  1361. assert(format != NULL);
  1362. assert(kwlist != NULL);
  1363. assert(p_va != NULL);
  1364. /* grab the function name or custom error msg first (mutually exclusive) */
  1365. fname = strchr(format, ':');
  1366. if (fname) {
  1367. fname++;
  1368. custom_msg = NULL;
  1369. }
  1370. else {
  1371. custom_msg = strchr(format,';');
  1372. if (custom_msg)
  1373. custom_msg++;
  1374. }
  1375. /* scan kwlist and get greatest possible nbr of args */
  1376. for (len=0; kwlist[len]; len++)
  1377. continue;
  1378. nargs = PyTuple_GET_SIZE(args);
  1379. nkeywords = (keywords == NULL) ? 0 : PyDict_Size(keywords);
  1380. if (nargs + nkeywords > len) {
  1381. PyErr_Format(PyExc_TypeError, "%s%s takes at most %d "
  1382. "argument%s (%d given)",
  1383. (fname == NULL) ? "function" : fname,
  1384. (fname == NULL) ? "" : "()",
  1385. len,
  1386. (len == 1) ? "" : "s",
  1387. nargs + nkeywords);
  1388. return 0;
  1389. }
  1390. /* convert tuple args and keyword args in same loop, using kwlist to drive process */
  1391. for (i = 0; i < len; i++) {
  1392. keyword = kwlist[i];
  1393. if (*format == '|') {
  1394. min = i;
  1395. format++;
  1396. }
  1397. if (IS_END_OF_FORMAT(*format)) {
  1398. PyErr_Format(PyExc_RuntimeError,
  1399. "More keyword list entries (%d) than "
  1400. "format specifiers (%d)", len, i);
  1401. return cleanreturn(0, freelist);
  1402. }
  1403. current_arg = NULL;
  1404. if (nkeywords) {
  1405. current_arg = PyDict_GetItemString(keywords, keyword);
  1406. }
  1407. if (current_arg) {
  1408. --nkeywords;
  1409. if (i < nargs) {
  1410. /* arg present in tuple and in dict */
  1411. PyErr_Format(PyExc_TypeError,
  1412. "Argument given by name ('%s') "
  1413. "and position (%d)",
  1414. keyword, i+1);
  1415. return cleanreturn(0, freelist);
  1416. }
  1417. }
  1418. else if (nkeywords && PyErr_Occurred())
  1419. return cleanreturn(0, freelist);
  1420. else if (i < nargs)
  1421. current_arg = PyTuple_GET_ITEM(args, i);
  1422. if (current_arg) {
  1423. msg = convertitem(current_arg, &format, p_va, flags,
  1424. levels, msgbuf, sizeof(msgbuf), &freelist);
  1425. if (msg) {
  1426. seterror(i+1, msg, levels, fname, custom_msg);
  1427. return cleanreturn(0, freelist);
  1428. }
  1429. continue;
  1430. }
  1431. if (i < min) {
  1432. PyErr_Format(PyExc_TypeError, "Required argument "
  1433. "'%s' (pos %d) not found",
  1434. keyword, i+1);
  1435. return cleanreturn(0, freelist);
  1436. }
  1437. /* current code reports success when all required args
  1438. * fulfilled and no keyword args left, with no further
  1439. * validation. XXX Maybe skip this in debug build ?
  1440. */
  1441. if (!nkeywords)
  1442. return cleanreturn(1, freelist);
  1443. /* We are into optional args, skip thru to any remaining
  1444. * keyword args */
  1445. msg = skipitem(&format, p_va, flags);
  1446. if (msg) {
  1447. PyErr_Format(PyExc_RuntimeError, "%s: '%s'", msg,
  1448. format);
  1449. return cleanreturn(0, freelist);
  1450. }
  1451. }
  1452. if (!IS_END_OF_FORMAT(*format) && *format != '|') {
  1453. PyErr_Format(PyExc_RuntimeError,
  1454. "more argument specifiers than keyword list entries "
  1455. "(remaining format:'%s')", format);
  1456. return cleanreturn(0, freelist);
  1457. }
  1458. /* make sure there are no extraneous keyword arguments */
  1459. if (nkeywords > 0) {
  1460. PyObjec

Large files files are truncated, but you can click here to view the full file