PageRenderTime 66ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/Python/getargs.c

https://bitbucket.org/arigo/cpython-withatomic/
C | 1809 lines | 1492 code | 192 blank | 125 comment | 475 complexity | c2289866602048209c44521d61442d82 MD5 | raw file
Possible License(s): 0BSD

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

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