Mercurial > cpython-lru_cache-weakref
annotate Python/getargs.c @ 81257:c256764e2b3f 3.2
Issue #16455: On FreeBSD and Solaris, if the locale is C, the
ASCII/surrogateescape codec is now used, instead of the locale encoding, to
decode the command line arguments. This change fixes inconsistencies with
os.fsencode() and os.fsdecode() because these operating systems announces an
ASCII locale encoding, whereas the ISO-8859-1 encoding is used in practice.
| author | Victor Stinner <victor.stinner@gmail.com> |
|---|---|
| date | Thu, 03 Jan 2013 01:08:58 +0100 |
| parents | 71e854617297 |
| children | 38830281d43b 29abedd4f4bb |
| rev | line source |
|---|---|
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2 /* New getargs implementation */ |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
4 #include "Python.h" |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5 |
|
4102
9569664ac347
Add needed #include <ctype.h>
Guido van Rossum <guido@python.org>
parents:
4026
diff
changeset
|
6 #include <ctype.h> |
|
9569664ac347
Add needed #include <ctype.h>
Guido van Rossum <guido@python.org>
parents:
4026
diff
changeset
|
7 |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
8 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
9 #ifdef __cplusplus |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
10 extern "C" { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
11 #endif |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
12 int PyArg_Parse(PyObject *, const char *, ...); |
|
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
13 int PyArg_ParseTuple(PyObject *, const char *, ...); |
|
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
14 int PyArg_VaParse(PyObject *, const char *, va_list); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
15 |
|
13447
a89f7f268de4
Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents:
13378
diff
changeset
|
16 int PyArg_ParseTupleAndKeywords(PyObject *, PyObject *, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
17 const char *, char **, ...); |
|
32606
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
18 int PyArg_VaParseTupleAndKeywords(PyObject *, PyObject *, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
19 const char *, char **, va_list); |
|
32606
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
20 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
21 #ifdef HAVE_DECLSPEC_DLL |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
22 /* Export functions */ |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
23 PyAPI_FUNC(int) _PyArg_Parse_SizeT(PyObject *, char *, ...); |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
24 PyAPI_FUNC(int) _PyArg_ParseTuple_SizeT(PyObject *, char *, ...); |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
25 PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywords_SizeT(PyObject *, PyObject *, |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
26 const char *, char **, ...); |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
27 PyAPI_FUNC(PyObject *) _Py_BuildValue_SizeT(const char *, ...); |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
28 PyAPI_FUNC(int) _PyArg_VaParse_SizeT(PyObject *, char *, va_list); |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
29 PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *, PyObject *, |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
30 const char *, char **, va_list); |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
31 #endif |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
32 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
33 #define FLAG_COMPAT 1 |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
34 #define FLAG_SIZE_T 2 |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
35 |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
36 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
37 /* Forward */ |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
38 static int vgetargs1(PyObject *, const char *, va_list *, int); |
|
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
39 static void seterror(int, const char *, int *, const char *, const char *); |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
40 static char *convertitem(PyObject *, const char **, va_list *, int, int *, |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
41 char *, size_t, PyObject **); |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
42 static char *converttuple(PyObject *, const char **, va_list *, int, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
43 int *, char *, size_t, int, PyObject **); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
44 static char *convertsimple(PyObject *, const char **, va_list *, int, char *, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
45 size_t, PyObject **); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
46 static Py_ssize_t convertbuffer(PyObject *, void **p, char **); |
|
48683
cd3b0b7fd8e1
Merged revisions 65654 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
48660
diff
changeset
|
47 static int getbuffer(PyObject *, Py_buffer *, char**); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
48 |
|
13447
a89f7f268de4
Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents:
13378
diff
changeset
|
49 static int vgetargskeywords(PyObject *, PyObject *, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
50 const char *, char **, va_list *, int); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
51 static char *skipitem(const char **, va_list *, int); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
52 |
|
20629
acc7e3b4d042
Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents:
20371
diff
changeset
|
53 int |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
54 PyArg_Parse(PyObject *args, const char *format, ...) |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
55 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
56 int retval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
57 va_list va; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
58 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
59 va_start(va, format); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
60 retval = vgetargs1(args, format, &va, FLAG_COMPAT); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
61 va_end(va); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
62 return retval; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
63 } |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
64 |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
65 int |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
66 _PyArg_Parse_SizeT(PyObject *args, char *format, ...) |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
67 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
68 int retval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
69 va_list va; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
70 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
71 va_start(va, format); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
72 retval = vgetargs1(args, format, &va, FLAG_COMPAT|FLAG_SIZE_T); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
73 va_end(va); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
74 return retval; |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
75 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
76 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
77 |
|
20629
acc7e3b4d042
Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents:
20371
diff
changeset
|
78 int |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
79 PyArg_ParseTuple(PyObject *args, const char *format, ...) |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
80 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
81 int retval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
82 va_list va; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
83 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
84 va_start(va, format); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
85 retval = vgetargs1(args, format, &va, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
86 va_end(va); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
87 return retval; |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
88 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
89 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
90 int |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
91 _PyArg_ParseTuple_SizeT(PyObject *args, char *format, ...) |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
92 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
93 int retval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
94 va_list va; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
95 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
96 va_start(va, format); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
97 retval = vgetargs1(args, format, &va, FLAG_SIZE_T); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
98 va_end(va); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
99 return retval; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
100 } |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
101 |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
102 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
103 int |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
104 PyArg_VaParse(PyObject *args, const char *format, va_list va) |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
105 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
106 va_list lva; |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2004
diff
changeset
|
107 |
|
63924
9108e7dcd7d8
Issue #2443: Added a new macro, Py_VA_COPY, which is equivalent to C99
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63259
diff
changeset
|
108 Py_VA_COPY(lva, va); |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2004
diff
changeset
|
109 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
110 return vgetargs1(args, format, &lva, 0); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
111 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
112 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
113 int |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
114 _PyArg_VaParse_SizeT(PyObject *args, char *format, va_list va) |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
115 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
116 va_list lva; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
117 |
|
63924
9108e7dcd7d8
Issue #2443: Added a new macro, Py_VA_COPY, which is equivalent to C99
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63259
diff
changeset
|
118 Py_VA_COPY(lva, va); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
119 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
120 return vgetargs1(args, format, &lva, FLAG_SIZE_T); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
121 } |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
122 |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
123 |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
124 /* Handle cleanup of allocated memory in case of exception */ |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
125 |
|
53816
911df82bc25d
add a replacement API for PyCObject, PyCapsule #5630
Benjamin Peterson <benjamin@python.org>
parents:
53072
diff
changeset
|
126 #define GETARGS_CAPSULE_NAME_CLEANUP_PTR "getargs.cleanup_ptr" |
|
911df82bc25d
add a replacement API for PyCObject, PyCapsule #5630
Benjamin Peterson <benjamin@python.org>
parents:
53072
diff
changeset
|
127 #define GETARGS_CAPSULE_NAME_CLEANUP_BUFFER "getargs.cleanup_buffer" |
|
54421
11de35da281c
Issue #6012: Add cleanup support to O& argument parsing.
Martin v. Löwis <martin@v.loewis.de>
parents:
53816
diff
changeset
|
128 #define GETARGS_CAPSULE_NAME_CLEANUP_CONVERT "getargs.cleanup_convert" |
|
53816
911df82bc25d
add a replacement API for PyCObject, PyCapsule #5630
Benjamin Peterson <benjamin@python.org>
parents:
53072
diff
changeset
|
129 |
|
48888
27e142d99a71
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48880
diff
changeset
|
130 static void |
|
53816
911df82bc25d
add a replacement API for PyCObject, PyCapsule #5630
Benjamin Peterson <benjamin@python.org>
parents:
53072
diff
changeset
|
131 cleanup_ptr(PyObject *self) |
|
48888
27e142d99a71
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48880
diff
changeset
|
132 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
133 void *ptr = PyCapsule_GetPointer(self, GETARGS_CAPSULE_NAME_CLEANUP_PTR); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
134 if (ptr) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
135 PyMem_FREE(ptr); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
136 } |
|
48888
27e142d99a71
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48880
diff
changeset
|
137 } |
|
27e142d99a71
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48880
diff
changeset
|
138 |
|
27e142d99a71
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48880
diff
changeset
|
139 static void |
|
53816
911df82bc25d
add a replacement API for PyCObject, PyCapsule #5630
Benjamin Peterson <benjamin@python.org>
parents:
53072
diff
changeset
|
140 cleanup_buffer(PyObject *self) |
|
48888
27e142d99a71
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48880
diff
changeset
|
141 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
142 Py_buffer *ptr = (Py_buffer *)PyCapsule_GetPointer(self, GETARGS_CAPSULE_NAME_CLEANUP_BUFFER); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
143 if (ptr) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
144 PyBuffer_Release(ptr); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
145 } |
|
48888
27e142d99a71
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48880
diff
changeset
|
146 } |
|
27e142d99a71
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48880
diff
changeset
|
147 |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
148 static int |
|
67345
a7d15df7d67d
Issue #8992: Simplify addcleanup() API
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67342
diff
changeset
|
149 addcleanup(void *ptr, PyObject **freelist, int is_buffer) |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
150 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
151 PyObject *cobj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
152 const char *name; |
|
67345
a7d15df7d67d
Issue #8992: Simplify addcleanup() API
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67342
diff
changeset
|
153 PyCapsule_Destructor destr; |
|
a7d15df7d67d
Issue #8992: Simplify addcleanup() API
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67342
diff
changeset
|
154 |
|
a7d15df7d67d
Issue #8992: Simplify addcleanup() API
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67342
diff
changeset
|
155 if (is_buffer) { |
|
a7d15df7d67d
Issue #8992: Simplify addcleanup() API
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67342
diff
changeset
|
156 destr = cleanup_buffer; |
|
a7d15df7d67d
Issue #8992: Simplify addcleanup() API
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67342
diff
changeset
|
157 name = GETARGS_CAPSULE_NAME_CLEANUP_BUFFER; |
|
a7d15df7d67d
Issue #8992: Simplify addcleanup() API
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67342
diff
changeset
|
158 } else { |
|
a7d15df7d67d
Issue #8992: Simplify addcleanup() API
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67342
diff
changeset
|
159 destr = cleanup_ptr; |
|
a7d15df7d67d
Issue #8992: Simplify addcleanup() API
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67342
diff
changeset
|
160 name = GETARGS_CAPSULE_NAME_CLEANUP_PTR; |
|
a7d15df7d67d
Issue #8992: Simplify addcleanup() API
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67342
diff
changeset
|
161 } |
|
53816
911df82bc25d
add a replacement API for PyCObject, PyCapsule #5630
Benjamin Peterson <benjamin@python.org>
parents:
53072
diff
changeset
|
162 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
163 if (!*freelist) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
164 *freelist = PyList_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
165 if (!*freelist) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
166 destr(ptr); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
167 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
168 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
169 } |
|
53816
911df82bc25d
add a replacement API for PyCObject, PyCapsule #5630
Benjamin Peterson <benjamin@python.org>
parents:
53072
diff
changeset
|
170 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
171 cobj = PyCapsule_New(ptr, name, destr); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
172 if (!cobj) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
173 destr(ptr); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
174 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
175 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
176 if (PyList_Append(*freelist, cobj)) { |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
177 Py_DECREF(cobj); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
178 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
179 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
180 Py_DECREF(cobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
181 return 0; |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
182 } |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
183 |
|
54421
11de35da281c
Issue #6012: Add cleanup support to O& argument parsing.
Martin v. Löwis <martin@v.loewis.de>
parents:
53816
diff
changeset
|
184 static void |
|
11de35da281c
Issue #6012: Add cleanup support to O& argument parsing.
Martin v. Löwis <martin@v.loewis.de>
parents:
53816
diff
changeset
|
185 cleanup_convert(PyObject *self) |
|
11de35da281c
Issue #6012: Add cleanup support to O& argument parsing.
Martin v. Löwis <martin@v.loewis.de>
parents:
53816
diff
changeset
|
186 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
187 typedef int (*destr_t)(PyObject *, void *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
188 destr_t destr = (destr_t)PyCapsule_GetContext(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
189 void *ptr = PyCapsule_GetPointer(self, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
190 GETARGS_CAPSULE_NAME_CLEANUP_CONVERT); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
191 if (ptr && destr) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
192 destr(NULL, ptr); |
|
54421
11de35da281c
Issue #6012: Add cleanup support to O& argument parsing.
Martin v. Löwis <martin@v.loewis.de>
parents:
53816
diff
changeset
|
193 } |
|
11de35da281c
Issue #6012: Add cleanup support to O& argument parsing.
Martin v. Löwis <martin@v.loewis.de>
parents:
53816
diff
changeset
|
194 |
|
11de35da281c
Issue #6012: Add cleanup support to O& argument parsing.
Martin v. Löwis <martin@v.loewis.de>
parents:
53816
diff
changeset
|
195 static int |
|
11de35da281c
Issue #6012: Add cleanup support to O& argument parsing.
Martin v. Löwis <martin@v.loewis.de>
parents:
53816
diff
changeset
|
196 addcleanup_convert(void *ptr, PyObject **freelist, int (*destr)(PyObject*,void*)) |
|
11de35da281c
Issue #6012: Add cleanup support to O& argument parsing.
Martin v. Löwis <martin@v.loewis.de>
parents:
53816
diff
changeset
|
197 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
198 PyObject *cobj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
199 if (!*freelist) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
200 *freelist = PyList_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
201 if (!*freelist) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
202 destr(NULL, ptr); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
203 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
204 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
205 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
206 cobj = PyCapsule_New(ptr, GETARGS_CAPSULE_NAME_CLEANUP_CONVERT, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
207 cleanup_convert); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
208 if (!cobj) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
209 destr(NULL, ptr); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
210 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
211 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
212 if (PyCapsule_SetContext(cobj, destr) == -1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
213 /* This really should not happen. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
214 Py_FatalError("capsule refused setting of context."); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
215 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
216 if (PyList_Append(*freelist, cobj)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
217 Py_DECREF(cobj); /* This will also call destr. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
218 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
219 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
220 Py_DECREF(cobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
221 return 0; |
|
54421
11de35da281c
Issue #6012: Add cleanup support to O& argument parsing.
Martin v. Löwis <martin@v.loewis.de>
parents:
53816
diff
changeset
|
222 } |
|
11de35da281c
Issue #6012: Add cleanup support to O& argument parsing.
Martin v. Löwis <martin@v.loewis.de>
parents:
53816
diff
changeset
|
223 |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
224 static int |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
225 cleanreturn(int retval, PyObject *freelist) |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
226 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
227 if (freelist && retval != 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
228 /* We were successful, reset the destructors so that they |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
229 don't get called. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
230 Py_ssize_t len = PyList_GET_SIZE(freelist), i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
231 for (i = 0; i < len; i++) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
232 PyCapsule_SetDestructor(PyList_GET_ITEM(freelist, i), NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
233 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
234 Py_XDECREF(freelist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
235 return retval; |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
236 } |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
237 |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
238 |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
239 static int |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
240 vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags) |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
241 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
242 char msgbuf[256]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
243 int levels[32]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
244 const char *fname = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
245 const char *message = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
246 int min = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
247 int max = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
248 int level = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
249 int endfmt = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
250 const char *formatsave = format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
251 Py_ssize_t i, len; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
252 char *msg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
253 PyObject *freelist = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
254 int compat = flags & FLAG_COMPAT; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
255 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
256 assert(compat || (args != (PyObject*)NULL)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
257 flags = flags & ~FLAG_COMPAT; |
|
16582
9a8e961b505f
Related to SF bug 132008 (PyList_Reverse blows up).
Tim Peters <tim.peters@gmail.com>
parents:
16264
diff
changeset
|
258 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
259 while (endfmt == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
260 int c = *format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
261 switch (c) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
262 case '(': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
263 if (level == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
264 max++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
265 level++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
266 if (level >= 30) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
267 Py_FatalError("too many tuple nesting levels " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
268 "in argument format string"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
269 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
270 case ')': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
271 if (level == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
272 Py_FatalError("excess ')' in getargs format"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
273 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
274 level--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
275 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
276 case '\0': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
277 endfmt = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
278 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
279 case ':': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
280 fname = format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
281 endfmt = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
282 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
283 case ';': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
284 message = format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
285 endfmt = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
286 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
287 default: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
288 if (level == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
289 if (c == 'O') |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
290 max++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
291 else if (isalpha(Py_CHARMASK(c))) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
292 if (c != 'e') /* skip encoded */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
293 max++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
294 } else if (c == '|') |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
295 min = max; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
296 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
297 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
298 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
299 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
300 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
301 if (level != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
302 Py_FatalError(/* '(' */ "missing ')' in getargs format"); |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
303 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
304 if (min < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
305 min = max; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
306 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
307 format = formatsave; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
308 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
309 if (compat) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
310 if (max == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
311 if (args == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
312 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
313 PyOS_snprintf(msgbuf, sizeof(msgbuf), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
314 "%.200s%s takes no arguments", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
315 fname==NULL ? "function" : fname, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
316 fname==NULL ? "" : "()"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
317 PyErr_SetString(PyExc_TypeError, msgbuf); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
318 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
319 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
320 else if (min == 1 && max == 1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
321 if (args == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
322 PyOS_snprintf(msgbuf, sizeof(msgbuf), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
323 "%.200s%s takes at least one argument", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
324 fname==NULL ? "function" : fname, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
325 fname==NULL ? "" : "()"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
326 PyErr_SetString(PyExc_TypeError, msgbuf); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
327 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
328 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
329 msg = convertitem(args, &format, p_va, flags, levels, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
330 msgbuf, sizeof(msgbuf), &freelist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
331 if (msg == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
332 return cleanreturn(1, freelist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
333 seterror(levels[0], msg, levels+1, fname, message); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
334 return cleanreturn(0, freelist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
335 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
336 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
337 PyErr_SetString(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
338 "old style getargs format uses new features"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
339 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
340 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
341 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
342 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
343 if (!PyTuple_Check(args)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
344 PyErr_SetString(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
345 "new style getargs format but argument is not a tuple"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
346 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
347 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
348 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
349 len = PyTuple_GET_SIZE(args); |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
350 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
351 if (len < min || max < len) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
352 if (message == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
353 PyOS_snprintf(msgbuf, sizeof(msgbuf), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
354 "%.150s%s takes %s %d argument%s " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
355 "(%ld given)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
356 fname==NULL ? "function" : fname, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
357 fname==NULL ? "" : "()", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
358 min==max ? "exactly" |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
359 : len < min ? "at least" : "at most", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
360 len < min ? min : max, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
361 (len < min ? min : max) == 1 ? "" : "s", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
362 Py_SAFE_DOWNCAST(len, Py_ssize_t, long)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
363 message = msgbuf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
364 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
365 PyErr_SetString(PyExc_TypeError, message); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
366 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
367 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
368 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
369 for (i = 0; i < len; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
370 if (*format == '|') |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
371 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
372 msg = convertitem(PyTuple_GET_ITEM(args, i), &format, p_va, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
373 flags, levels, msgbuf, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
374 sizeof(msgbuf), &freelist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
375 if (msg) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
376 seterror(i+1, msg, levels, fname, msg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
377 return cleanreturn(0, freelist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
378 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
379 } |
|
6805
93e480dedcf0
Add explicit check for correct next character in format at end of
Guido van Rossum <guido@python.org>
parents:
5410
diff
changeset
|
380 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
381 if (*format != '\0' && !isalpha(Py_CHARMASK(*format)) && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
382 *format != '(' && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
383 *format != '|' && *format != ':' && *format != ';') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
384 PyErr_Format(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
385 "bad format string: %.200s", formatsave); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
386 return cleanreturn(0, freelist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
387 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
388 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
389 return cleanreturn(1, freelist); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
390 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
391 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
392 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
393 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
394 static void |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
395 seterror(int iarg, const char *msg, int *levels, const char *fname, |
|
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
396 const char *message) |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
397 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
398 char buf[512]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
399 int i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
400 char *p = buf; |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
401 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
402 if (PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
403 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
404 else if (message == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
405 if (fname != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
406 PyOS_snprintf(p, sizeof(buf), "%.200s() ", fname); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
407 p += strlen(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
408 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
409 if (iarg != 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
410 PyOS_snprintf(p, sizeof(buf) - (p - buf), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
411 "argument %d", iarg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
412 i = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
413 p += strlen(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
414 while (levels[i] > 0 && i < 32 && (int)(p-buf) < 220) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
415 PyOS_snprintf(p, sizeof(buf) - (p - buf), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
416 ", item %d", levels[i]-1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
417 p += strlen(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
418 i++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
419 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
420 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
421 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
422 PyOS_snprintf(p, sizeof(buf) - (p - buf), "argument"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
423 p += strlen(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
424 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
425 PyOS_snprintf(p, sizeof(buf) - (p - buf), " %.256s", msg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
426 message = buf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
427 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
428 PyErr_SetString(PyExc_TypeError, message); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
429 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
430 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
431 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
432 /* Convert a tuple argument. |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
433 On entry, *p_format points to the character _after_ the opening '('. |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
434 On successful exit, *p_format points to the closing ')'. |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
435 If successful: |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
436 *p_format and *p_va are updated, |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
437 *levels and *msgbuf are untouched, |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
438 and NULL is returned. |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
439 If the argument is invalid: |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
440 *p_format is unchanged, |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
441 *p_va is undefined, |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
442 *levels is a 0-terminated list of item numbers, |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
443 *msgbuf contains an error message, whose format is: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
444 "must be <typename1>, not <typename2>", where: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
445 <typename1> is the name of the expected type, and |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
446 <typename2> is the name of the actual type, |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
447 and msgbuf is returned. |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
448 */ |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
449 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
450 static char * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
451 converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags, |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
452 int *levels, char *msgbuf, size_t bufsize, int toplevel, |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
453 PyObject **freelist) |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
454 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
455 int level = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
456 int n = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
457 const char *format = *p_format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
458 int i; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
459 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
460 for (;;) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
461 int c = *format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
462 if (c == '(') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
463 if (level == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
464 n++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
465 level++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
466 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
467 else if (c == ')') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
468 if (level == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
469 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
470 level--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
471 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
472 else if (c == ':' || c == ';' || c == '\0') |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
473 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
474 else if (level == 0 && isalpha(Py_CHARMASK(c))) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
475 n++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
476 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
477 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
478 if (!PySequence_Check(arg) || PyBytes_Check(arg)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
479 levels[0] = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
480 PyOS_snprintf(msgbuf, bufsize, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
481 toplevel ? "expected %d arguments, not %.50s" : |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
482 "must be %d-item sequence, not %.50s", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
483 n, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
484 arg == Py_None ? "None" : arg->ob_type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
485 return msgbuf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
486 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
487 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
488 if ((i = PySequence_Size(arg)) != n) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
489 levels[0] = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
490 PyOS_snprintf(msgbuf, bufsize, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
491 toplevel ? "expected %d arguments, not %d" : |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
492 "must be sequence of length %d, not %d", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
493 n, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
494 return msgbuf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
495 } |
|
15899
152814f6cd11
This patch makes sure that the function name always appears in the error
Ka-Ping Yee <ping@zesty.ca>
parents:
15502
diff
changeset
|
496 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
497 format = *p_format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
498 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
499 char *msg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
500 PyObject *item; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
501 item = PySequence_GetItem(arg, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
502 if (item == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
503 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
504 levels[0] = i+1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
505 levels[1] = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
506 strncpy(msgbuf, "is not retrievable", bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
507 return msgbuf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
508 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
509 msg = convertitem(item, &format, p_va, flags, levels+1, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
510 msgbuf, bufsize, freelist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
511 /* PySequence_GetItem calls tp->sq_item, which INCREFs */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
512 Py_XDECREF(item); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
513 if (msg != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
514 levels[0] = i+1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
515 return msg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
516 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
517 } |
|
15899
152814f6cd11
This patch makes sure that the function name always appears in the error
Ka-Ping Yee <ping@zesty.ca>
parents:
15502
diff
changeset
|
518 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
519 *p_format = format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
520 return NULL; |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
521 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
522 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
523 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
524 /* Convert a single item. */ |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
525 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
526 static char * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
527 convertitem(PyObject *arg, const char **p_format, va_list *p_va, int flags, |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
528 int *levels, char *msgbuf, size_t bufsize, PyObject **freelist) |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
529 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
530 char *msg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
531 const char *format = *p_format; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
532 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
533 if (*format == '(' /* ')' */) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
534 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
535 msg = converttuple(arg, &format, p_va, flags, levels, msgbuf, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
536 bufsize, 0, freelist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
537 if (msg == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
538 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
539 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
540 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
541 msg = convertsimple(arg, &format, p_va, flags, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
542 msgbuf, bufsize, freelist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
543 if (msg != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
544 levels[0] = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
545 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
546 if (msg == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
547 *p_format = format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
548 return msg; |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
549 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
550 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
551 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
552 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
553 #define UNICODE_DEFAULT_ENCODING(arg) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
554 _PyUnicode_AsDefaultEncodedString(arg, NULL) |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
555 |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
556 /* Format an error message generated by convertsimple(). */ |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
557 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
558 static char * |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
559 converterr(const char *expected, PyObject *arg, char *msgbuf, size_t bufsize) |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
560 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
561 assert(expected != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
562 assert(arg != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
563 PyOS_snprintf(msgbuf, bufsize, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
564 "must be %.50s, not %.50s", expected, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
565 arg == Py_None ? "None" : arg->ob_type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
566 return msgbuf; |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
567 } |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
568 |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
569 #define CONV_UNICODE "(unicode conversion error)" |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
570 |
|
36988
49c6eb688906
Checkpoint. 218 tests are okay; 53 are failing. Done so far:
Guido van Rossum <guido@python.org>
parents:
36773
diff
changeset
|
571 /* Explicitly check for float arguments when integers are expected. |
|
49c6eb688906
Checkpoint. 218 tests are okay; 53 are failing. Done so far:
Guido van Rossum <guido@python.org>
parents:
36773
diff
changeset
|
572 Return 1 for error, 0 if ok. */ |
|
27685
9e47f9ed49f6
If a float is passed where a int is expected, issue a DeprecationWarning
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
27363
diff
changeset
|
573 static int |
|
9e47f9ed49f6
If a float is passed where a int is expected, issue a DeprecationWarning
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
27363
diff
changeset
|
574 float_argument_error(PyObject *arg) |
|
9e47f9ed49f6
If a float is passed where a int is expected, issue a DeprecationWarning
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
27363
diff
changeset
|
575 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
576 if (PyFloat_Check(arg)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
577 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
578 "integer argument expected, got float" ); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
579 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
580 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
581 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
582 return 0; |
|
27685
9e47f9ed49f6
If a float is passed where a int is expected, issue a DeprecationWarning
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
27363
diff
changeset
|
583 } |
|
9e47f9ed49f6
If a float is passed where a int is expected, issue a DeprecationWarning
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
27363
diff
changeset
|
584 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
585 /* Convert a non-tuple argument. Return NULL if conversion went OK, |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
586 or a string with a message describing the failure. The message is |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
587 formatted as "must be <desired type>, not <actual type>". |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
588 When failing, an exception may or may not have been raised. |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
589 Don't call if a tuple is expected. |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
590 |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
591 When you add new format codes, please don't forget poor skipitem() below. |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
592 */ |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
593 |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
594 static char * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
595 convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
596 char *msgbuf, size_t bufsize, PyObject **freelist) |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
597 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
598 /* For # codes */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
599 #define FETCH_SIZE int *q=NULL;Py_ssize_t *q2=NULL;\ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
600 if (flags & FLAG_SIZE_T) q2=va_arg(*p_va, Py_ssize_t*); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
601 else q=va_arg(*p_va, int*); |
|
68794
d9633064458c
Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62483
diff
changeset
|
602 #define STORE_SIZE(s) \ |
|
d9633064458c
Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62483
diff
changeset
|
603 if (flags & FLAG_SIZE_T) \ |
|
d9633064458c
Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62483
diff
changeset
|
604 *q2=s; \ |
|
d9633064458c
Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62483
diff
changeset
|
605 else { \ |
|
d9633064458c
Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62483
diff
changeset
|
606 if (INT_MAX < s) { \ |
|
d9633064458c
Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62483
diff
changeset
|
607 PyErr_SetString(PyExc_OverflowError, \ |
|
d9633064458c
Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62483
diff
changeset
|
608 "size does not fit in an int"); \ |
|
d9633064458c
Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62483
diff
changeset
|
609 return converterr("", arg, msgbuf, bufsize); \ |
|
d9633064458c
Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62483
diff
changeset
|
610 } \ |
|
d9633064458c
Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62483
diff
changeset
|
611 *q=s; \ |
|
d9633064458c
Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62483
diff
changeset
|
612 } |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
613 #define BUFFER_LEN ((flags & FLAG_SIZE_T) ? *q2:*q) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
614 #define RETURN_ERR_OCCURRED return msgbuf |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
615 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
616 const char *format = *p_format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
617 char c = *format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
618 PyObject *uarg; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
619 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
620 switch (c) { |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
621 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
622 case 'b': { /* unsigned byte -- very short int */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
623 char *p = va_arg(*p_va, char *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
624 long ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
625 if (float_argument_error(arg)) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
626 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
627 ival = PyLong_AsLong(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
628 if (ival == -1 && PyErr_Occurred()) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
629 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
630 else if (ival < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
631 PyErr_SetString(PyExc_OverflowError, |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
632 "unsigned byte integer is less than minimum"); |
|
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
633 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
634 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
635 else if (ival > UCHAR_MAX) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
636 PyErr_SetString(PyExc_OverflowError, |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
637 "unsigned byte integer is greater than maximum"); |
|
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
638 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
639 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
640 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
641 *p = (unsigned char) ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
642 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
643 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
644 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
645 case 'B': {/* byte sized bitfield - both signed and unsigned |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
646 values allowed */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
647 char *p = va_arg(*p_va, char *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
648 long ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
649 if (float_argument_error(arg)) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
650 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
651 ival = PyLong_AsUnsignedLongMask(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
652 if (ival == -1 && PyErr_Occurred()) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
653 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
654 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
655 *p = (unsigned char) ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
656 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
657 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
658 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
659 case 'h': {/* signed short int */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
660 short *p = va_arg(*p_va, short *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
661 long ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
662 if (float_argument_error(arg)) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
663 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
664 ival = PyLong_AsLong(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
665 if (ival == -1 && PyErr_Occurred()) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
666 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
667 else if (ival < SHRT_MIN) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
668 PyErr_SetString(PyExc_OverflowError, |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
669 "signed short integer is less than minimum"); |
|
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
670 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
671 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
672 else if (ival > SHRT_MAX) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
673 PyErr_SetString(PyExc_OverflowError, |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
674 "signed short integer is greater than maximum"); |
|
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
675 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
676 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
677 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
678 *p = (short) ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
679 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
680 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
681 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
682 case 'H': { /* short int sized bitfield, both signed and |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
683 unsigned allowed */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
684 unsigned short *p = va_arg(*p_va, unsigned short *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
685 long ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
686 if (float_argument_error(arg)) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
687 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
688 ival = PyLong_AsUnsignedLongMask(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
689 if (ival == -1 && PyErr_Occurred()) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
690 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
691 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
692 *p = (unsigned short) ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
693 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
694 } |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
695 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
696 case 'i': {/* signed int */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
697 int *p = va_arg(*p_va, int *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
698 long ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
699 if (float_argument_error(arg)) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
700 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
701 ival = PyLong_AsLong(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
702 if (ival == -1 && PyErr_Occurred()) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
703 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
704 else if (ival > INT_MAX) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
705 PyErr_SetString(PyExc_OverflowError, |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
706 "signed integer is greater than maximum"); |
|
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
707 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
708 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
709 else if (ival < INT_MIN) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
710 PyErr_SetString(PyExc_OverflowError, |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
711 "signed integer is less than minimum"); |
|
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
712 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
713 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
714 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
715 *p = ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
716 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
717 } |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
718 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
719 case 'I': { /* int sized bitfield, both signed and |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
720 unsigned allowed */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
721 unsigned int *p = va_arg(*p_va, unsigned int *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
722 unsigned int ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
723 if (float_argument_error(arg)) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
724 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
725 ival = (unsigned int)PyLong_AsUnsignedLongMask(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
726 if (ival == (unsigned int)-1 && PyErr_Occurred()) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
727 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
728 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
729 *p = ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
730 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
731 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
732 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
733 case 'n': /* Py_ssize_t */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
734 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
735 PyObject *iobj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
736 Py_ssize_t *p = va_arg(*p_va, Py_ssize_t *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
737 Py_ssize_t ival = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
738 if (float_argument_error(arg)) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
739 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
740 iobj = PyNumber_Index(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
741 if (iobj != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
742 ival = PyLong_AsSsize_t(iobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
743 Py_DECREF(iobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
744 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
745 if (ival == -1 && PyErr_Occurred()) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
746 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
747 *p = ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
748 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
749 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
750 case 'l': {/* long int */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
751 long *p = va_arg(*p_va, long *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
752 long ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
753 if (float_argument_error(arg)) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
754 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
755 ival = PyLong_AsLong(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
756 if (ival == -1 && PyErr_Occurred()) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
757 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
758 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
759 *p = ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
760 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
761 } |
|
28652
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
762 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
763 case 'k': { /* long sized bitfield */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
764 unsigned long *p = va_arg(*p_va, unsigned long *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
765 unsigned long ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
766 if (PyLong_Check(arg)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
767 ival = PyLong_AsUnsignedLongMask(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
768 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
769 return converterr("integer<k>", arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
770 *p = ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
771 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
772 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
773 |
|
9949
98e37347378b
Change rare occurrences of #if HAVE_LONG_LONG to #ifdef.
Guido van Rossum <guido@python.org>
parents:
9306
diff
changeset
|
774 #ifdef HAVE_LONG_LONG |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
775 case 'L': {/* PY_LONG_LONG */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
776 PY_LONG_LONG *p = va_arg( *p_va, PY_LONG_LONG * ); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60931
diff
changeset
|
777 PY_LONG_LONG ival; |
|
62221
fe5ed70283ef
Issue #8950: Make PyArg_Parse* with 'L' code raise for float inputs,
Mark Dickinson <dickinsm@gmail.com>
parents:
62202
diff
changeset
|
778 if (float_argument_error(arg)) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
779 RETURN_ERR_OCCURRED; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60931
diff
changeset
|
780 ival = PyLong_AsLongLong(arg); |
|
62221
fe5ed70283ef
Issue #8950: Make PyArg_Parse* with 'L' code raise for float inputs,
Mark Dickinson <dickinsm@gmail.com>
parents:
62202
diff
changeset
|
781 if (ival == (PY_LONG_LONG)-1 && PyErr_Occurred()) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
782 RETURN_ERR_OCCURRED; |
|
62221
fe5ed70283ef
Issue #8950: Make PyArg_Parse* with 'L' code raise for float inputs,
Mark Dickinson <dickinsm@gmail.com>
parents:
62202
diff
changeset
|
783 else |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
784 *p = ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
785 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
786 } |
|
28652
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
787 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
788 case 'K': { /* long long sized bitfield */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
789 unsigned PY_LONG_LONG *p = va_arg(*p_va, unsigned PY_LONG_LONG *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
790 unsigned PY_LONG_LONG ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
791 if (PyLong_Check(arg)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
792 ival = PyLong_AsUnsignedLongLongMask(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
793 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
794 return converterr("integer<K>", arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
795 *p = ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
796 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
797 } |
|
8822
bd47ee068b83
Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
8358
diff
changeset
|
798 #endif |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
799 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
800 case 'f': {/* float */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
801 float *p = va_arg(*p_va, float *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
802 double dval = PyFloat_AsDouble(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
803 if (PyErr_Occurred()) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
804 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
805 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
806 *p = (float) dval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
807 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
808 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
809 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
810 case 'd': {/* double */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
811 double *p = va_arg(*p_va, double *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
812 double dval = PyFloat_AsDouble(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
813 if (PyErr_Occurred()) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
814 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
815 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
816 *p = dval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
817 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
818 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
819 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
820 case 'D': {/* complex double */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
821 Py_complex *p = va_arg(*p_va, Py_complex *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
822 Py_complex cval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
823 cval = PyComplex_AsCComplex(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
824 if (PyErr_Occurred()) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
825 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
826 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
827 *p = cval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
828 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
829 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
830 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
831 case 'c': {/* char */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
832 char *p = va_arg(*p_va, char *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
833 if (PyBytes_Check(arg) && PyBytes_Size(arg) == 1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
834 *p = PyBytes_AS_STRING(arg)[0]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
835 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
836 return converterr("a byte string of length 1", arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
837 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
838 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
839 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
840 case 'C': {/* unicode char */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
841 int *p = va_arg(*p_va, int *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
842 if (PyUnicode_Check(arg) && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
843 PyUnicode_GET_SIZE(arg) == 1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
844 *p = PyUnicode_AS_UNICODE(arg)[0]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
845 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
846 return converterr("a unicode character", arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
847 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
848 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
849 |
|
62202
d7113cacd428
Issue #8838, #8339: Remove codecs.charbuffer_encode() and "t#" parsing format
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62197
diff
changeset
|
850 /* XXX WAAAAH! 's', 'y', 'z', 'u', 'Z', 'e', 'w' codes all |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
851 need to be cleaned up! */ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
852 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
853 case 'y': {/* any buffer-like object, but not PyUnicode */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
854 void **p = (void **)va_arg(*p_va, char **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
855 char *buf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
856 Py_ssize_t count; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
857 if (*format == '*') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
858 if (getbuffer(arg, (Py_buffer*)p, &buf) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
859 return converterr(buf, arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
860 format++; |
|
67345
a7d15df7d67d
Issue #8992: Simplify addcleanup() API
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67342
diff
changeset
|
861 if (addcleanup(p, freelist, 1)) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
862 return converterr( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
863 "(cleanup problem)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
864 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
865 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
866 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
867 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
868 count = convertbuffer(arg, p, &buf); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
869 if (count < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
870 return converterr(buf, arg, msgbuf, bufsize); |
|
62322
b32a2816f6e9
Issue #8592: PyArg_Parse*() functions raise a TypeError for "y", "u" and "Z"
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62221
diff
changeset
|
871 if (*format == '#') { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
872 FETCH_SIZE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
873 STORE_SIZE(count); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
874 format++; |
|
62322
b32a2816f6e9
Issue #8592: PyArg_Parse*() functions raise a TypeError for "y", "u" and "Z"
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62221
diff
changeset
|
875 } else { |
|
b32a2816f6e9
Issue #8592: PyArg_Parse*() functions raise a TypeError for "y", "u" and "Z"
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62221
diff
changeset
|
876 if (strlen(*p) != count) |
|
b32a2816f6e9
Issue #8592: PyArg_Parse*() functions raise a TypeError for "y", "u" and "Z"
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62221
diff
changeset
|
877 return converterr( |
|
b32a2816f6e9
Issue #8592: PyArg_Parse*() functions raise a TypeError for "y", "u" and "Z"
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62221
diff
changeset
|
878 "bytes without null bytes", |
|
b32a2816f6e9
Issue #8592: PyArg_Parse*() functions raise a TypeError for "y", "u" and "Z"
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62221
diff
changeset
|
879 arg, msgbuf, bufsize); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
880 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
881 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
882 } |
|
41611
c48fe4dc34a9
Change UnicodeDecodeError objects so that the 'object' attribute
Walter Dörwald <walter@livinglogic.de>
parents:
41596
diff
changeset
|
883 |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
884 case 's': /* text string */ |
|
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
885 case 'z': /* text string or None */ |
|
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
886 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
887 if (*format == '*') { |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
888 /* "s*" or "z*" */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
889 Py_buffer *p = (Py_buffer *)va_arg(*p_va, Py_buffer *); |
|
48683
cd3b0b7fd8e1
Merged revisions 65654 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
48660
diff
changeset
|
890 |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
891 if (c == 'z' && arg == Py_None) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
892 PyBuffer_FillInfo(p, NULL, NULL, 0, 1, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
893 else if (PyUnicode_Check(arg)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
894 uarg = UNICODE_DEFAULT_ENCODING(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
895 if (uarg == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
896 return converterr(CONV_UNICODE, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
897 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
898 PyBuffer_FillInfo(p, arg, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
899 PyBytes_AS_STRING(uarg), PyBytes_GET_SIZE(uarg), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
900 1, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
901 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
902 else { /* any buffer-like object */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
903 char *buf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
904 if (getbuffer(arg, p, &buf) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
905 return converterr(buf, arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
906 } |
|
67345
a7d15df7d67d
Issue #8992: Simplify addcleanup() API
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67342
diff
changeset
|
907 if (addcleanup(p, freelist, 1)) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
908 return converterr( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
909 "(cleanup problem)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
910 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
911 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
912 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
913 } else if (*format == '#') { /* any buffer-like object */ |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
914 /* "s#" or "z#" */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
915 void **p = (void **)va_arg(*p_va, char **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
916 FETCH_SIZE; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
917 |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
918 if (c == 'z' && arg == Py_None) { |
|
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
919 *p = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
920 STORE_SIZE(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
921 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
922 else if (PyUnicode_Check(arg)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
923 uarg = UNICODE_DEFAULT_ENCODING(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
924 if (uarg == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
925 return converterr(CONV_UNICODE, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
926 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
927 *p = PyBytes_AS_STRING(uarg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
928 STORE_SIZE(PyBytes_GET_SIZE(uarg)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
929 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
930 else { /* any buffer-like object */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
931 /* XXX Really? */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
932 char *buf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
933 Py_ssize_t count = convertbuffer(arg, p, &buf); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
934 if (count < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
935 return converterr(buf, arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
936 STORE_SIZE(count); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
937 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
938 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
939 } else { |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
940 /* "s" or "z" */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
941 char **p = va_arg(*p_va, char **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
942 uarg = NULL; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
943 |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
944 if (c == 'z' && arg == Py_None) |
|
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
945 *p = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
946 else if (PyUnicode_Check(arg)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
947 uarg = UNICODE_DEFAULT_ENCODING(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
948 if (uarg == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
949 return converterr(CONV_UNICODE, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
950 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
951 *p = PyBytes_AS_STRING(uarg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
952 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
953 else |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
954 return converterr(c == 'z' ? "str or None" : "str", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
955 arg, msgbuf, bufsize); |
|
61972
852d5ea625e7
Remove dead code
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61970
diff
changeset
|
956 if (*p != NULL && uarg != NULL && |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
957 (Py_ssize_t) strlen(*p) != PyBytes_GET_SIZE(uarg)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
958 return converterr( |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
959 c == 'z' ? "str without null bytes or None" |
|
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
960 : "str without null bytes", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
961 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
962 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
963 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
964 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
965 |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
966 case 'u': /* raw unicode buffer (Py_UNICODE *) */ |
|
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
967 case 'Z': /* raw unicode buffer or None */ |
|
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
968 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
969 if (*format == '#') { /* any buffer-like object */ |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
970 /* "s#" or "Z#" */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
971 Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
972 FETCH_SIZE; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
973 |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
974 if (c == 'Z' && arg == Py_None) { |
|
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
975 *p = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
976 STORE_SIZE(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
977 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
978 else if (PyUnicode_Check(arg)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
979 *p = PyUnicode_AS_UNICODE(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
980 STORE_SIZE(PyUnicode_GET_SIZE(arg)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
981 } |
|
62198
b2c1995633bd
Merged revisions 81849 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
982 else |
|
b2c1995633bd
Merged revisions 81849 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
983 return converterr("str or None", arg, msgbuf, bufsize); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
984 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
985 } else { |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
986 /* "s" or "Z" */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
987 Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **); |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
988 |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
989 if (c == 'Z' && arg == Py_None) |
|
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
990 *p = NULL; |
|
62322
b32a2816f6e9
Issue #8592: PyArg_Parse*() functions raise a TypeError for "y", "u" and "Z"
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62221
diff
changeset
|
991 else if (PyUnicode_Check(arg)) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
992 *p = PyUnicode_AS_UNICODE(arg); |
|
62322
b32a2816f6e9
Issue #8592: PyArg_Parse*() functions raise a TypeError for "y", "u" and "Z"
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62221
diff
changeset
|
993 if (Py_UNICODE_strlen(*p) != PyUnicode_GET_SIZE(arg)) |
|
b32a2816f6e9
Issue #8592: PyArg_Parse*() functions raise a TypeError for "y", "u" and "Z"
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62221
diff
changeset
|
994 return converterr( |
|
b32a2816f6e9
Issue #8592: PyArg_Parse*() functions raise a TypeError for "y", "u" and "Z"
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62221
diff
changeset
|
995 "str without null character or None", |
|
b32a2816f6e9
Issue #8592: PyArg_Parse*() functions raise a TypeError for "y", "u" and "Z"
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62221
diff
changeset
|
996 arg, msgbuf, bufsize); |
|
b32a2816f6e9
Issue #8592: PyArg_Parse*() functions raise a TypeError for "y", "u" and "Z"
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62221
diff
changeset
|
997 } else |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
998 return converterr(c == 'Z' ? "str or None" : "str", |
|
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
999 arg, msgbuf, bufsize); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1000 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1001 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1002 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1003 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1004 case 'e': {/* encoded string */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1005 char **buffer; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1006 const char *encoding; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1007 PyObject *s; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1008 int recode_strings; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1009 Py_ssize_t size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1010 const char *ptr; |
| 12051 | 1011 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1012 /* Get 'e' parameter: the encoding name */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1013 encoding = (const char *)va_arg(*p_va, const char *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1014 if (encoding == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1015 encoding = PyUnicode_GetDefaultEncoding(); |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1016 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1017 /* Get output buffer parameter: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1018 's' (recode all objects via Unicode) or |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1019 't' (only recode non-string objects) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1020 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1021 if (*format == 's') |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1022 recode_strings = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1023 else if (*format == 't') |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1024 recode_strings = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1025 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1026 return converterr( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1027 "(unknown parser marker combination)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1028 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1029 buffer = (char **)va_arg(*p_va, char **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1030 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1031 if (buffer == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1032 return converterr("(buffer is NULL)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1033 arg, msgbuf, bufsize); |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1034 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1035 /* Encode object */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1036 if (!recode_strings && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1037 (PyBytes_Check(arg) || PyByteArray_Check(arg))) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1038 s = arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1039 Py_INCREF(s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1040 if (PyObject_AsCharBuffer(s, &ptr, &size) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1041 return converterr("(AsCharBuffer failed)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1042 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1043 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1044 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1045 PyObject *u; |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18887
diff
changeset
|
1046 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1047 /* Convert object to Unicode */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1048 u = PyUnicode_FromObject(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1049 if (u == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1050 return converterr( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1051 "string or unicode or text buffer", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1052 arg, msgbuf, bufsize); |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1053 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1054 /* Encode object; use default error handling */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1055 s = PyUnicode_AsEncodedString(u, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1056 encoding, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1057 NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1058 Py_DECREF(u); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1059 if (s == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1060 return converterr("(encoding failed)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1061 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1062 if (!PyBytes_Check(s)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1063 Py_DECREF(s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1064 return converterr( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1065 "(encoder failed to return bytes)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1066 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1067 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1068 size = PyBytes_GET_SIZE(s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1069 ptr = PyBytes_AS_STRING(s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1070 if (ptr == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1071 ptr = ""; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1072 } |
| 12051 | 1073 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1074 /* Write output; output is guaranteed to be 0-terminated */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1075 if (*format == '#') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1076 /* Using buffer length parameter '#': |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1077 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1078 - if *buffer is NULL, a new buffer of the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1079 needed size is allocated and the data |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1080 copied into it; *buffer is updated to point |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1081 to the new buffer; the caller is |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1082 responsible for PyMem_Free()ing it after |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1083 usage |
| 12051 | 1084 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1085 - if *buffer is not NULL, the data is |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1086 copied to *buffer; *buffer_len has to be |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1087 set to the size of the buffer on input; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1088 buffer overflow is signalled with an error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1089 buffer has to provide enough room for the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1090 encoded string plus the trailing 0-byte |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1091 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1092 - in both cases, *buffer_len is updated to |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1093 the size of the buffer /excluding/ the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1094 trailing 0-byte |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1095 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1096 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1097 FETCH_SIZE; |
| 12051 | 1098 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1099 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1100 if (q == NULL && q2 == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1101 Py_DECREF(s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1102 return converterr( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1103 "(buffer_len is NULL)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1104 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1105 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1106 if (*buffer == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1107 *buffer = PyMem_NEW(char, size + 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1108 if (*buffer == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1109 Py_DECREF(s); |
|
62151
c3f2ed4d8e65
convertsimple(): call PyErr_NoMemory() on PyMem_NEW() failure
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62149
diff
changeset
|
1110 PyErr_NoMemory(); |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
1111 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1112 } |
|
67345
a7d15df7d67d
Issue #8992: Simplify addcleanup() API
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67342
diff
changeset
|
1113 if (addcleanup(*buffer, freelist, 0)) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1114 Py_DECREF(s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1115 return converterr( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1116 "(cleanup problem)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1117 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1118 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1119 } else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1120 if (size + 1 > BUFFER_LEN) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1121 Py_DECREF(s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1122 return converterr( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1123 "(buffer overflow)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1124 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1125 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1126 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1127 memcpy(*buffer, ptr, size+1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1128 STORE_SIZE(size); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1129 } else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1130 /* Using a 0-terminated buffer: |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1131 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1132 - the encoded string has to be 0-terminated |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1133 for this variant to work; if it is not, an |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1134 error raised |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1135 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1136 - a new buffer of the needed size is |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1137 allocated and the data copied into it; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1138 *buffer is updated to point to the new |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1139 buffer; the caller is responsible for |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1140 PyMem_Free()ing it after usage |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1141 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1142 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1143 if ((Py_ssize_t)strlen(ptr) != size) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1144 Py_DECREF(s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1145 return converterr( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1146 "encoded string without NULL bytes", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1147 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1148 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1149 *buffer = PyMem_NEW(char, size + 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1150 if (*buffer == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1151 Py_DECREF(s); |
|
62151
c3f2ed4d8e65
convertsimple(): call PyErr_NoMemory() on PyMem_NEW() failure
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62149
diff
changeset
|
1152 PyErr_NoMemory(); |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
1153 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1154 } |
|
67345
a7d15df7d67d
Issue #8992: Simplify addcleanup() API
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67342
diff
changeset
|
1155 if (addcleanup(*buffer, freelist, 0)) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1156 Py_DECREF(s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1157 return converterr("(cleanup problem)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1158 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1159 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1160 memcpy(*buffer, ptr, size+1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1161 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1162 Py_DECREF(s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1163 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1164 } |
|
12570
3dbe41380266
Brian Hooper <brian_takashi@hotmail.com>:
Fred Drake <fdrake@acm.org>
parents:
12510
diff
changeset
|
1165 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1166 case 'S': { /* PyBytes object */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1167 PyObject **p = va_arg(*p_va, PyObject **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1168 if (PyBytes_Check(arg)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1169 *p = arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1170 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1171 return converterr("bytes", arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1172 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1173 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1174 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1175 case 'Y': { /* PyByteArray object */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1176 PyObject **p = va_arg(*p_va, PyObject **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1177 if (PyByteArray_Check(arg)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1178 *p = arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1179 else |
|
62198
b2c1995633bd
Merged revisions 81849 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
1180 return converterr("bytearray", arg, msgbuf, bufsize); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1181 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1182 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1183 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1184 case 'U': { /* PyUnicode object */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1185 PyObject **p = va_arg(*p_va, PyObject **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1186 if (PyUnicode_Check(arg)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1187 *p = arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1188 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1189 return converterr("str", arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1190 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1191 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1192 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1193 case 'O': { /* object */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1194 PyTypeObject *type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1195 PyObject **p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1196 if (*format == '!') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1197 type = va_arg(*p_va, PyTypeObject*); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1198 p = va_arg(*p_va, PyObject **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1199 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1200 if (PyType_IsSubtype(arg->ob_type, type)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1201 *p = arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1202 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1203 return converterr(type->tp_name, arg, msgbuf, bufsize); |
|
8358
da4bdceeaad7
Another veeeeeery old patch...
Guido van Rossum <guido@python.org>
parents:
7982
diff
changeset
|
1204 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1205 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1206 else if (*format == '&') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1207 typedef int (*converter)(PyObject *, void *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1208 converter convert = va_arg(*p_va, converter); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1209 void *addr = va_arg(*p_va, void *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1210 int res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1211 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1212 if (! (res = (*convert)(arg, addr))) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1213 return converterr("(unspecified)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1214 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1215 if (res == Py_CLEANUP_SUPPORTED && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1216 addcleanup_convert(addr, freelist, convert) == -1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1217 return converterr("(cleanup problem)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1218 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1219 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1220 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1221 p = va_arg(*p_va, PyObject **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1222 *p = arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1223 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1224 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1225 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1226 |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1227 |
|
62484
bcc0e825faa0
Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62482
diff
changeset
|
1228 case 'w': { /* "w*": memory buffer, read-write access */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1229 void **p = va_arg(*p_va, void **); |
|
48683
cd3b0b7fd8e1
Merged revisions 65654 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
48660
diff
changeset
|
1230 |
|
62484
bcc0e825faa0
Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62482
diff
changeset
|
1231 if (*format != '*') |
|
bcc0e825faa0
Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62482
diff
changeset
|
1232 return converterr( |
|
bcc0e825faa0
Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62482
diff
changeset
|
1233 "invalid use of 'w' format character", |
|
bcc0e825faa0
Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62482
diff
changeset
|
1234 arg, msgbuf, bufsize); |
|
bcc0e825faa0
Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62482
diff
changeset
|
1235 format++; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1236 |
|
62484
bcc0e825faa0
Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62482
diff
changeset
|
1237 /* Caller is interested in Py_buffer, and the object |
|
bcc0e825faa0
Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62482
diff
changeset
|
1238 supports it directly. */ |
|
bcc0e825faa0
Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62482
diff
changeset
|
1239 if (PyObject_GetBuffer(arg, (Py_buffer*)p, PyBUF_WRITABLE) < 0) { |
|
bcc0e825faa0
Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62482
diff
changeset
|
1240 PyErr_Clear(); |
|
bcc0e825faa0
Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62482
diff
changeset
|
1241 return converterr("read-write buffer", arg, msgbuf, bufsize); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1242 } |
|
63259
ac7eb6eaef68
Issue #8991: convertbuffer() rejects discontigious buffers
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62484
diff
changeset
|
1243 if (!PyBuffer_IsContiguous((Py_buffer*)p, 'C')) { |
|
ac7eb6eaef68
Issue #8991: convertbuffer() rejects discontigious buffers
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62484
diff
changeset
|
1244 PyBuffer_Release((Py_buffer*)p); |
|
ac7eb6eaef68
Issue #8991: convertbuffer() rejects discontigious buffers
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62484
diff
changeset
|
1245 return converterr("contiguous buffer", arg, msgbuf, bufsize); |
|
ac7eb6eaef68
Issue #8991: convertbuffer() rejects discontigious buffers
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62484
diff
changeset
|
1246 } |
|
67345
a7d15df7d67d
Issue #8992: Simplify addcleanup() API
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67342
diff
changeset
|
1247 if (addcleanup(p, freelist, 1)) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1248 return converterr( |
|
62484
bcc0e825faa0
Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62482
diff
changeset
|
1249 "(cleanup problem)", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1250 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1251 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1252 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1253 } |
|
9306
79439e4e9976
Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents:
9044
diff
changeset
|
1254 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1255 default: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1256 return converterr("impossible<bad format char>", arg, msgbuf, bufsize); |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1257 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1258 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1259 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1260 *p_format = format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1261 return NULL; |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
1262 |
|
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
1263 #undef FETCH_SIZE |
|
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
1264 #undef STORE_SIZE |
|
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
1265 #undef BUFFER_LEN |
|
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
1266 #undef RETURN_ERR_OCCURRED |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1267 } |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1268 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1269 static Py_ssize_t |
|
20629
acc7e3b4d042
Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents:
20371
diff
changeset
|
1270 convertbuffer(PyObject *arg, void **p, char **errmsg) |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1271 { |
|
62149
9d49b744078c
Simplify getbuffer(): convertbuffer() fails anyway if bf_getbuffer is NULL
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61972
diff
changeset
|
1272 PyBufferProcs *pb = Py_TYPE(arg)->tp_as_buffer; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1273 Py_ssize_t count; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1274 Py_buffer view; |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
42139
diff
changeset
|
1275 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1276 *errmsg = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1277 *p = NULL; |
|
63259
ac7eb6eaef68
Issue #8991: convertbuffer() rejects discontigious buffers
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62484
diff
changeset
|
1278 if (pb != NULL && pb->bf_releasebuffer != NULL) { |
|
ac7eb6eaef68
Issue #8991: convertbuffer() rejects discontigious buffers
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62484
diff
changeset
|
1279 *errmsg = "read-only pinned buffer"; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1280 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1281 } |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
42139
diff
changeset
|
1282 |
|
63259
ac7eb6eaef68
Issue #8991: convertbuffer() rejects discontigious buffers
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62484
diff
changeset
|
1283 if (getbuffer(arg, &view, errmsg) < 0) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1284 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1285 count = view.len; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1286 *p = view.buf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1287 PyBuffer_Release(&view); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1288 return count; |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1289 } |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1290 |
|
48683
cd3b0b7fd8e1
Merged revisions 65654 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
48660
diff
changeset
|
1291 static int |
|
48848
5c75a33ef5b2
Merged revisions 66006 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents:
48683
diff
changeset
|
1292 getbuffer(PyObject *arg, Py_buffer *view, char **errmsg) |
|
48683
cd3b0b7fd8e1
Merged revisions 65654 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
48660
diff
changeset
|
1293 { |
|
63259
ac7eb6eaef68
Issue #8991: convertbuffer() rejects discontigious buffers
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62484
diff
changeset
|
1294 if (PyObject_GetBuffer(arg, view, PyBUF_SIMPLE) != 0) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1295 *errmsg = "bytes or buffer"; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1296 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1297 } |
|
62149
9d49b744078c
Simplify getbuffer(): convertbuffer() fails anyway if bf_getbuffer is NULL
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61972
diff
changeset
|
1298 if (!PyBuffer_IsContiguous(view, 'C')) { |
|
62482
bb6222a4ed24
getbuffer(): release the buffer on error (if the buffer is not contiguous)
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62478
diff
changeset
|
1299 PyBuffer_Release(view); |
|
62149
9d49b744078c
Simplify getbuffer(): convertbuffer() fails anyway if bf_getbuffer is NULL
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61972
diff
changeset
|
1300 *errmsg = "contiguous buffer"; |
|
9d49b744078c
Simplify getbuffer(): convertbuffer() fails anyway if bf_getbuffer is NULL
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61972
diff
changeset
|
1301 return -1; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1302 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1303 return 0; |
|
48683
cd3b0b7fd8e1
Merged revisions 65654 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
48660
diff
changeset
|
1304 } |
|
cd3b0b7fd8e1
Merged revisions 65654 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
48660
diff
changeset
|
1305 |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1306 /* Support for keyword arguments donated by |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1307 Geoff Philbrick <philbric@delphi.hks.com> */ |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1308 |
|
20711
2890769b1e69
PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents:
20710
diff
changeset
|
1309 /* Return false (0) for error, else true. */ |
|
20629
acc7e3b4d042
Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents:
20371
diff
changeset
|
1310 int |
|
acc7e3b4d042
Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents:
20371
diff
changeset
|
1311 PyArg_ParseTupleAndKeywords(PyObject *args, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1312 PyObject *keywords, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1313 const char *format, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1314 char **kwlist, ...) |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1315 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1316 int retval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1317 va_list va; |
|
20710
a44cc0c21cfe
PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents:
20709
diff
changeset
|
1318 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1319 if ((args == NULL || !PyTuple_Check(args)) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1320 (keywords != NULL && !PyDict_Check(keywords)) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1321 format == NULL || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1322 kwlist == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1323 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1324 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1325 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1326 } |
|
20710
a44cc0c21cfe
PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents:
20709
diff
changeset
|
1327 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1328 va_start(va, kwlist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1329 retval = vgetargskeywords(args, keywords, format, kwlist, &va, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1330 va_end(va); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1331 return retval; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1332 } |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1333 |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1334 int |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1335 _PyArg_ParseTupleAndKeywords_SizeT(PyObject *args, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1336 PyObject *keywords, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1337 const char *format, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1338 char **kwlist, ...) |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1339 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1340 int retval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1341 va_list va; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1342 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1343 if ((args == NULL || !PyTuple_Check(args)) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1344 (keywords != NULL && !PyDict_Check(keywords)) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1345 format == NULL || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1346 kwlist == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1347 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1348 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1349 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1350 } |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1351 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1352 va_start(va, kwlist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1353 retval = vgetargskeywords(args, keywords, format, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1354 kwlist, &va, FLAG_SIZE_T); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1355 va_end(va); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1356 return retval; |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1357 } |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1358 |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1359 |
|
32606
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1360 int |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1361 PyArg_VaParseTupleAndKeywords(PyObject *args, |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
1362 PyObject *keywords, |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1363 const char *format, |
|
36675
dba6494735d0
Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36625
diff
changeset
|
1364 char **kwlist, va_list va) |
|
32606
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1365 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1366 int retval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1367 va_list lva; |
|
32606
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1368 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1369 if ((args == NULL || !PyTuple_Check(args)) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1370 (keywords != NULL && !PyDict_Check(keywords)) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1371 format == NULL || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1372 kwlist == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1373 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1374 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1375 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1376 } |
|
32606
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1377 |
|
63924
9108e7dcd7d8
Issue #2443: Added a new macro, Py_VA_COPY, which is equivalent to C99
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63259
diff
changeset
|
1378 Py_VA_COPY(lva, va); |
|
32606
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1379 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1380 retval = vgetargskeywords(args, keywords, format, kwlist, &lva, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1381 return retval; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1382 } |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1383 |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1384 int |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1385 _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *args, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1386 PyObject *keywords, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1387 const char *format, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1388 char **kwlist, va_list va) |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1389 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1390 int retval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1391 va_list lva; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1392 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1393 if ((args == NULL || !PyTuple_Check(args)) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1394 (keywords != NULL && !PyDict_Check(keywords)) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1395 format == NULL || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1396 kwlist == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1397 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1398 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1399 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1400 } |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1401 |
|
63924
9108e7dcd7d8
Issue #2443: Added a new macro, Py_VA_COPY, which is equivalent to C99
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63259
diff
changeset
|
1402 Py_VA_COPY(lva, va); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1403 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1404 retval = vgetargskeywords(args, keywords, format, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1405 kwlist, &lva, FLAG_SIZE_T); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1406 return retval; |
|
32606
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1407 } |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1408 |
|
60931
79128efe8a99
prevent the dict constructor from accepting non-string keyword args #8419
Benjamin Peterson <benjamin@python.org>
parents:
60399
diff
changeset
|
1409 int |
|
79128efe8a99
prevent the dict constructor from accepting non-string keyword args #8419
Benjamin Peterson <benjamin@python.org>
parents:
60399
diff
changeset
|
1410 PyArg_ValidateKeywordArguments(PyObject *kwargs) |
|
79128efe8a99
prevent the dict constructor from accepting non-string keyword args #8419
Benjamin Peterson <benjamin@python.org>
parents:
60399
diff
changeset
|
1411 { |
|
66220
379029714e24
handle dict subclasses gracefully in PyArg_ValidateKeywordArguments
Benjamin Peterson <benjamin@python.org>
parents:
63924
diff
changeset
|
1412 if (!PyDict_Check(kwargs)) { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60931
diff
changeset
|
1413 PyErr_BadInternalCall(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60931
diff
changeset
|
1414 return 0; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60931
diff
changeset
|
1415 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60931
diff
changeset
|
1416 if (!_PyDict_HasOnlyStringKeys(kwargs)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60931
diff
changeset
|
1417 PyErr_SetString(PyExc_TypeError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60931
diff
changeset
|
1418 "keyword arguments must be strings"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60931
diff
changeset
|
1419 return 0; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60931
diff
changeset
|
1420 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60931
diff
changeset
|
1421 return 1; |
|
60931
79128efe8a99
prevent the dict constructor from accepting non-string keyword args #8419
Benjamin Peterson <benjamin@python.org>
parents:
60399
diff
changeset
|
1422 } |
|
79128efe8a99
prevent the dict constructor from accepting non-string keyword args #8419
Benjamin Peterson <benjamin@python.org>
parents:
60399
diff
changeset
|
1423 |
|
45548
8c3c5b4eef55
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45534
diff
changeset
|
1424 #define IS_END_OF_FORMAT(c) (c == '\0' || c == ';' || c == ':') |
|
32606
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1425 |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1426 static int |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
1427 vgetargskeywords(PyObject *args, PyObject *keywords, const char *format, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1428 char **kwlist, va_list *p_va, int flags) |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1429 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1430 char msgbuf[512]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1431 int levels[32]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1432 const char *fname, *msg, *custom_msg, *keyword; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1433 int min = INT_MAX; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1434 int i, len, nargs, nkeywords; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1435 PyObject *freelist = NULL, *current_arg; |
|
20708
e912b683ed3e
vgetargskeywords(): remove test that can't succeed. Not a bugfix, just
Tim Peters <tim.peters@gmail.com>
parents:
20632
diff
changeset
|
1436 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1437 assert(args != NULL && PyTuple_Check(args)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1438 assert(keywords == NULL || PyDict_Check(keywords)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1439 assert(format != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1440 assert(kwlist != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1441 assert(p_va != NULL); |
|
20710
a44cc0c21cfe
PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents:
20709
diff
changeset
|
1442 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1443 /* grab the function name or custom error msg first (mutually exclusive) */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1444 fname = strchr(format, ':'); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1445 if (fname) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1446 fname++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1447 custom_msg = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1448 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1449 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1450 custom_msg = strchr(format,';'); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1451 if (custom_msg) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1452 custom_msg++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1453 } |
|
45548
8c3c5b4eef55
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45534
diff
changeset
|
1454 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1455 /* scan kwlist and get greatest possible nbr of args */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1456 for (len=0; kwlist[len]; len++) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1457 continue; |
|
20711
2890769b1e69
PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents:
20710
diff
changeset
|
1458 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1459 nargs = PyTuple_GET_SIZE(args); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1460 nkeywords = (keywords == NULL) ? 0 : PyDict_Size(keywords); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1461 if (nargs + nkeywords > len) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1462 PyErr_Format(PyExc_TypeError, "%s%s takes at most %d " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1463 "argument%s (%d given)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1464 (fname == NULL) ? "function" : fname, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1465 (fname == NULL) ? "" : "()", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1466 len, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1467 (len == 1) ? "" : "s", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1468 nargs + nkeywords); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1469 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1470 } |
| 20723 | 1471 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1472 /* convert tuple args and keyword args in same loop, using kwlist to drive process */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1473 for (i = 0; i < len; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1474 keyword = kwlist[i]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1475 if (*format == '|') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1476 min = i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1477 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1478 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1479 if (IS_END_OF_FORMAT(*format)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1480 PyErr_Format(PyExc_RuntimeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1481 "More keyword list entries (%d) than " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1482 "format specifiers (%d)", len, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1483 return cleanreturn(0, freelist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1484 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1485 current_arg = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1486 if (nkeywords) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1487 current_arg = PyDict_GetItemString(keywords, keyword); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1488 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1489 if (current_arg) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1490 --nkeywords; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1491 if (i < nargs) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1492 /* arg present in tuple and in dict */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1493 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1494 "Argument given by name ('%s') " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1495 "and position (%d)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1496 keyword, i+1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1497 return cleanreturn(0, freelist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1498 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1499 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1500 else if (nkeywords && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1501 return cleanreturn(0, freelist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1502 else if (i < nargs) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1503 current_arg = PyTuple_GET_ITEM(args, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1504 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1505 if (current_arg) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1506 msg = convertitem(current_arg, &format, p_va, flags, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1507 levels, msgbuf, sizeof(msgbuf), &freelist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1508 if (msg) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1509 seterror(i+1, msg, levels, fname, custom_msg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1510 return cleanreturn(0, freelist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1511 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1512 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1513 } |
|
45548
8c3c5b4eef55
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45534
diff
changeset
|
1514 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1515 if (i < min) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1516 PyErr_Format(PyExc_TypeError, "Required argument " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1517 "'%s' (pos %d) not found", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1518 keyword, i+1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1519 return cleanreturn(0, freelist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1520 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1521 /* current code reports success when all required args |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1522 * fulfilled and no keyword args left, with no further |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1523 * validation. XXX Maybe skip this in debug build ? |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1524 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1525 if (!nkeywords) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1526 return cleanreturn(1, freelist); |
|
45548
8c3c5b4eef55
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45534
diff
changeset
|
1527 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1528 /* We are into optional args, skip thru to any remaining |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1529 * keyword args */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1530 msg = skipitem(&format, p_va, flags); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1531 if (msg) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1532 PyErr_Format(PyExc_RuntimeError, "%s: '%s'", msg, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1533 format); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1534 return cleanreturn(0, freelist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1535 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1536 } |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1537 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1538 if (!IS_END_OF_FORMAT(*format) && *format != '|') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1539 PyErr_Format(PyExc_RuntimeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1540 "more argument specifiers than keyword list entries " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1541 "(remaining format:'%s')", format); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1542 return cleanreturn(0, freelist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1543 } |
| 20715 | 1544 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1545 /* make sure there are no extraneous keyword arguments */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1546 if (nkeywords > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1547 PyObject *key, *value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1548 Py_ssize_t pos = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1549 while (PyDict_Next(keywords, &pos, &key, &value)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1550 int match = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1551 char *ks; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1552 if (!PyUnicode_Check(key)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1553 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1554 "keywords must be strings"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1555 return cleanreturn(0, freelist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1556 } |
|
61717
1504cc5a15a1
Issue #6697: Fix a crash if a keyword contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
1557 /* check that _PyUnicode_AsString() result is not NULL */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1558 ks = _PyUnicode_AsString(key); |
|
61717
1504cc5a15a1
Issue #6697: Fix a crash if a keyword contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
1559 if (ks != NULL) { |
|
1504cc5a15a1
Issue #6697: Fix a crash if a keyword contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
1560 for (i = 0; i < len; i++) { |
|
1504cc5a15a1
Issue #6697: Fix a crash if a keyword contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
1561 if (!strcmp(ks, kwlist[i])) { |
|
1504cc5a15a1
Issue #6697: Fix a crash if a keyword contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
1562 match = 1; |
|
1504cc5a15a1
Issue #6697: Fix a crash if a keyword contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
1563 break; |
|
1504cc5a15a1
Issue #6697: Fix a crash if a keyword contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
1564 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1565 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1566 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1567 if (!match) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1568 PyErr_Format(PyExc_TypeError, |
|
61717
1504cc5a15a1
Issue #6697: Fix a crash if a keyword contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
1569 "'%U' is an invalid keyword " |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1570 "argument for this function", |
|
61717
1504cc5a15a1
Issue #6697: Fix a crash if a keyword contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
1571 key); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1572 return cleanreturn(0, freelist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1573 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1574 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1575 } |
| 20723 | 1576 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1577 return cleanreturn(1, freelist); |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1578 } |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1579 |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1580 |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1581 static char * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1582 skipitem(const char **p_format, va_list *p_va, int flags) |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1583 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1584 const char *format = *p_format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1585 char c = *format++; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1586 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1587 switch (c) { |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1588 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1589 /* simple codes |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1590 * The individual types (second arg of va_arg) are irrelevant */ |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1591 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1592 case 'b': /* byte -- very short int */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1593 case 'B': /* byte as bitfield */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1594 case 'h': /* short int */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1595 case 'H': /* short int as bitfield */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1596 case 'i': /* int */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1597 case 'I': /* int sized bitfield */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1598 case 'l': /* long int */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1599 case 'k': /* long int sized bitfield */ |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1600 #ifdef HAVE_LONG_LONG |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1601 case 'L': /* PY_LONG_LONG */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1602 case 'K': /* PY_LONG_LONG sized bitfield */ |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1603 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1604 case 'f': /* float */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1605 case 'd': /* double */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1606 case 'D': /* complex double */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1607 case 'c': /* char */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1608 case 'C': /* unicode char */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1609 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1610 (void) va_arg(*p_va, void *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1611 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1612 } |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1613 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1614 case 'n': /* Py_ssize_t */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1615 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1616 (void) va_arg(*p_va, Py_ssize_t *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1617 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1618 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1619 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1620 /* string codes */ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1621 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1622 case 'e': /* string with encoding */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1623 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1624 (void) va_arg(*p_va, const char *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1625 if (!(*format == 's' || *format == 't')) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1626 /* after 'e', only 's' and 't' is allowed */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1627 goto err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1628 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1629 /* explicit fallthrough to string cases */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1630 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1631 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1632 case 's': /* string */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1633 case 'z': /* string or None */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1634 case 'y': /* bytes */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1635 case 'u': /* unicode string */ |
|
76834
91612618985b
Issue #14749: Add support for 'Z' to skipitem() in Python/getargs.c.
Larry Hastings <larry@hastings.org>
parents:
68795
diff
changeset
|
1636 case 'Z': /* unicode string or None */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1637 case 'w': /* buffer, read-write */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1638 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1639 (void) va_arg(*p_va, char **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1640 if (*format == '#') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1641 if (flags & FLAG_SIZE_T) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1642 (void) va_arg(*p_va, Py_ssize_t *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1643 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1644 (void) va_arg(*p_va, int *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1645 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1646 } else if ((c == 's' || c == 'z' || c == 'y') && *format == '*') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1647 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1648 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1649 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1650 } |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1651 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1652 /* object codes */ |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1653 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1654 case 'S': /* string object */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1655 case 'Y': /* string object */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1656 case 'U': /* unicode string object */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1657 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1658 (void) va_arg(*p_va, PyObject **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1659 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1660 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1661 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1662 case 'O': /* object */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1663 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1664 if (*format == '!') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1665 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1666 (void) va_arg(*p_va, PyTypeObject*); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1667 (void) va_arg(*p_va, PyObject **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1668 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1669 else if (*format == '&') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1670 typedef int (*converter)(PyObject *, void *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1671 (void) va_arg(*p_va, converter); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1672 (void) va_arg(*p_va, void *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1673 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1674 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1675 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1676 (void) va_arg(*p_va, PyObject **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1677 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1678 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1679 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1680 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1681 case '(': /* bypass tuple, not handled at all previously */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1682 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1683 char *msg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1684 for (;;) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1685 if (*format==')') |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1686 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1687 if (IS_END_OF_FORMAT(*format)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1688 return "Unmatched left paren in format " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1689 "string"; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1690 msg = skipitem(&format, p_va, flags); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1691 if (msg) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1692 return msg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1693 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1694 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1695 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1696 } |
|
45548
8c3c5b4eef55
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45534
diff
changeset
|
1697 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1698 case ')': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1699 return "Unmatched right paren in format string"; |
|
45548
8c3c5b4eef55
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45534
diff
changeset
|
1700 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1701 default: |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1702 err: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1703 return "impossible<bad format char>"; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1704 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1705 } |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1706 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1707 *p_format = format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1708 return NULL; |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1709 } |
|
20632
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1710 |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1711 |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1712 int |
|
36750
92ba72484ff3
Use Py_ssize_t for PyArg_UnpackTuple arguments.
Martin v. Löwis <martin@v.loewis.de>
parents:
36675
diff
changeset
|
1713 PyArg_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, ...) |
|
20632
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1714 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1715 Py_ssize_t i, l; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1716 PyObject **o; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1717 va_list vargs; |
|
20632
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1718 |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1719 #ifdef HAVE_STDARG_PROTOTYPES |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1720 va_start(vargs, max); |
|
20632
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1721 #else |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1722 va_start(vargs); |
|
20632
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1723 #endif |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1724 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1725 assert(min >= 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1726 assert(min <= max); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1727 if (!PyTuple_Check(args)) { |
|
78949
71e854617297
Added missing va_end in error branch of PyArg_UnpackTuple(). CID 486641
Christian Heimes <christian@cheimes.de>
parents:
76834
diff
changeset
|
1728 va_end(vargs); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1729 PyErr_SetString(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1730 "PyArg_UnpackTuple() argument list is not a tuple"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1731 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1732 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1733 l = PyTuple_GET_SIZE(args); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1734 if (l < min) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1735 if (name != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1736 PyErr_Format( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1737 PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1738 "%s expected %s%zd arguments, got %zd", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1739 name, (min == max ? "" : "at least "), min, l); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1740 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1741 PyErr_Format( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1742 PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1743 "unpacked tuple should have %s%zd elements," |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1744 " but has %zd", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1745 (min == max ? "" : "at least "), min, l); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1746 va_end(vargs); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1747 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1748 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1749 if (l > max) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1750 if (name != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1751 PyErr_Format( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1752 PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1753 "%s expected %s%zd arguments, got %zd", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1754 name, (min == max ? "" : "at most "), max, l); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1755 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1756 PyErr_Format( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1757 PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1758 "unpacked tuple should have %s%zd elements," |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1759 " but has %zd", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1760 (min == max ? "" : "at most "), max, l); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1761 va_end(vargs); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1762 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1763 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1764 for (i = 0; i < l; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1765 o = va_arg(vargs, PyObject **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1766 *o = PyTuple_GET_ITEM(args, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1767 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1768 va_end(vargs); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1769 return 1; |
|
20632
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1770 } |
|
35449
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1771 |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1772 |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1773 /* For type constructors that don't take keyword args |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1774 * |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1775 * Sets a TypeError and returns 0 if the kwds dict is |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
1776 * not empty, returns 1 otherwise |
|
35449
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1777 */ |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1778 int |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
1779 _PyArg_NoKeywords(const char *funcname, PyObject *kw) |
|
35449
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1780 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1781 if (kw == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1782 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1783 if (!PyDict_CheckExact(kw)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1784 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1785 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1786 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1787 if (PyDict_Size(kw) == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1788 return 1; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1789 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1790 PyErr_Format(PyExc_TypeError, "%s does not take keyword arguments", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1791 funcname); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1792 return 0; |
|
35449
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1793 } |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
1794 #ifdef __cplusplus |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
1795 }; |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
1796 #endif |
