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

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