Mercurial > cpython-lru_cache-weakref
annotate Python/getargs.c @ 56959:032d9749047d 2.6
Merged revisions 75931 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r75931 | benjamin.peterson | 2009-10-28 20:49:07 -0500 (Wed, 28 Oct 2009) | 5 lines
do a backport of r75928
The added test does not fail without the patch, but we still fix the issue of
surrogates being used in wide builds where they should not be.
........
| author | Benjamin Peterson <benjamin@python.org> |
|---|---|
| date | Thu, 29 Oct 2009 02:02:47 +0000 |
| parents | 3889d9528601 |
| children | e38335d4df91 3af3fb168638 |
| 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 |
|
37619
f19addd69ad9
avoid C++ name mangling for the _Py.*SizeT functions
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36773
diff
changeset
|
9 #ifdef __cplusplus |
|
f19addd69ad9
avoid C++ name mangling for the _Py.*SizeT functions
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36773
diff
changeset
|
10 extern "C" { |
|
f19addd69ad9
avoid C++ name mangling for the _Py.*SizeT functions
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36773
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 *, |
|
36675
dba6494735d0
Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36625
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 *, |
|
36675
dba6494735d0
Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36625
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 |
|
37702
9b22d8b7bcaa
Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents:
37697
diff
changeset
|
21 #ifdef HAVE_DECLSPEC_DLL |
|
9b22d8b7bcaa
Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents:
37697
diff
changeset
|
22 /* Export functions */ |
|
9b22d8b7bcaa
Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents:
37697
diff
changeset
|
23 PyAPI_FUNC(int) _PyArg_Parse_SizeT(PyObject *, char *, ...); |
|
9b22d8b7bcaa
Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents:
37697
diff
changeset
|
24 PyAPI_FUNC(int) _PyArg_ParseTuple_SizeT(PyObject *, char *, ...); |
|
9b22d8b7bcaa
Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents:
37697
diff
changeset
|
25 PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywords_SizeT(PyObject *, PyObject *, |
|
9b22d8b7bcaa
Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents:
37697
diff
changeset
|
26 const char *, char **, ...); |
|
9b22d8b7bcaa
Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents:
37697
diff
changeset
|
27 PyAPI_FUNC(PyObject *) _Py_BuildValue_SizeT(const char *, ...); |
|
9b22d8b7bcaa
Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents:
37697
diff
changeset
|
28 PyAPI_FUNC(int) _PyArg_VaParse_SizeT(PyObject *, char *, va_list); |
|
9b22d8b7bcaa
Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents:
37697
diff
changeset
|
29 PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *, PyObject *, |
|
9b22d8b7bcaa
Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents:
37697
diff
changeset
|
30 const char *, char **, va_list); |
|
9b22d8b7bcaa
Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents:
37697
diff
changeset
|
31 #endif |
|
9b22d8b7bcaa
Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents:
37697
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 *); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
40 static char *convertitem(PyObject *, const char **, va_list *, int, int *, |
|
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, |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
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 *, |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
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 **); |
|
48221
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
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 *, |
|
36675
dba6494735d0
Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36625
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 { |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
56 int retval; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
57 va_list va; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
58 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
59 va_start(va, format); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
60 retval = vgetargs1(args, format, &va, FLAG_COMPAT); |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
61 va_end(va); |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
62 return retval; |
|
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 { |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
68 int retval; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
69 va_list va; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
70 |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
71 va_start(va, format); |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
72 retval = vgetargs1(args, format, &va, FLAG_COMPAT|FLAG_SIZE_T); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
73 va_end(va); |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
74 return retval; |
|
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 { |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
81 int retval; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
82 va_list va; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
83 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
84 va_start(va, format); |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2004
diff
changeset
|
85 retval = vgetargs1(args, format, &va, 0); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
86 va_end(va); |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
87 return retval; |
|
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 { |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
93 int retval; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
94 va_list va; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
95 |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
96 va_start(va, format); |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
97 retval = vgetargs1(args, format, &va, FLAG_SIZE_T); |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
98 va_end(va); |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
99 return retval; |
|
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 { |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2004
diff
changeset
|
106 va_list lva; |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2004
diff
changeset
|
107 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2004
diff
changeset
|
108 #ifdef VA_LIST_IS_ARRAY |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2004
diff
changeset
|
109 memcpy(lva, va, sizeof(va_list)); |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2004
diff
changeset
|
110 #else |
|
24400
81ca6ca5c307
Patch #554716: Use __va_copy where available.
Martin v. Löwis <martin@v.loewis.de>
parents:
22801
diff
changeset
|
111 #ifdef __va_copy |
|
81ca6ca5c307
Patch #554716: Use __va_copy where available.
Martin v. Löwis <martin@v.loewis.de>
parents:
22801
diff
changeset
|
112 __va_copy(lva, va); |
|
81ca6ca5c307
Patch #554716: Use __va_copy where available.
Martin v. Löwis <martin@v.loewis.de>
parents:
22801
diff
changeset
|
113 #else |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2004
diff
changeset
|
114 lva = va; |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2004
diff
changeset
|
115 #endif |
|
24400
81ca6ca5c307
Patch #554716: Use __va_copy where available.
Martin v. Löwis <martin@v.loewis.de>
parents:
22801
diff
changeset
|
116 #endif |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2004
diff
changeset
|
117 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2004
diff
changeset
|
118 return vgetargs1(args, format, &lva, 0); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
119 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
120 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
121 int |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
122 _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
|
123 { |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
124 va_list lva; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
125 |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
126 #ifdef VA_LIST_IS_ARRAY |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
127 memcpy(lva, va, sizeof(va_list)); |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
128 #else |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
129 #ifdef __va_copy |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
130 __va_copy(lva, va); |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
131 #else |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
132 lva = va; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
133 #endif |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
134 #endif |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
135 |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
136 return vgetargs1(args, format, &lva, FLAG_SIZE_T); |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
137 } |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
138 |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
139 |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
140 /* 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
|
141 |
|
48889
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
142 static void |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
143 cleanup_ptr(void *ptr) |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
144 { |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
145 PyMem_FREE(ptr); |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
146 } |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
147 |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
148 static void |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
149 cleanup_buffer(void *ptr) |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
150 { |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
151 PyBuffer_Release((Py_buffer *) ptr); |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
152 } |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
153 |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
154 static int |
|
48889
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
155 addcleanup(void *ptr, PyObject **freelist, void (*destr)(void *)) |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
156 { |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
157 PyObject *cobj; |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
158 if (!*freelist) { |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
159 *freelist = PyList_New(0); |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
160 if (!*freelist) { |
|
48889
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
161 destr(ptr); |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
162 return -1; |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
163 } |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
164 } |
|
48889
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
165 cobj = PyCObject_FromVoidPtr(ptr, destr); |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
166 if (!cobj) { |
|
48889
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
167 destr(ptr); |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
168 return -1; |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
169 } |
|
45530
bf1ab3bf799c
Whitespace normalization
Neal Norwitz <nnorwitz@gmail.com>
parents:
44072
diff
changeset
|
170 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
|
171 Py_DECREF(cobj); |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
172 return -1; |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
173 } |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
174 Py_DECREF(cobj); |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
175 return 0; |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
176 } |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
177 |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
178 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
|
179 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
|
180 { |
|
48889
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
181 if (freelist && retval != 0) { |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
182 /* We were successful, reset the destructors so that they |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
183 don't get called. */ |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
184 Py_ssize_t len = PyList_GET_SIZE(freelist), i; |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
185 for (i = 0; i < len; i++) |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
186 ((PyCObject *) PyList_GET_ITEM(freelist, i)) |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
187 ->destructor = NULL; |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
188 } |
|
48889
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
189 Py_XDECREF(freelist); |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
190 return retval; |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
191 } |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
192 |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
193 |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
194 static int |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
195 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
|
196 { |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
197 char msgbuf[256]; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
198 int levels[32]; |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
199 const char *fname = NULL; |
|
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
200 const char *message = NULL; |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
201 int min = -1; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
202 int max = 0; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
203 int level = 0; |
|
17997
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
204 int endfmt = 0; |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
205 const char *formatsave = format; |
|
36521
30aef3ce2b26
Use Py_ssize_t to count the
Martin v. Löwis <martin@v.loewis.de>
parents:
36501
diff
changeset
|
206 Py_ssize_t i, len; |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
207 char *msg; |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
208 PyObject *freelist = NULL; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
209 int compat = flags & FLAG_COMPAT; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
210 |
|
16582
9a8e961b505f
Related to SF bug 132008 (PyList_Reverse blows up).
Tim Peters <tim.peters@gmail.com>
parents:
16264
diff
changeset
|
211 assert(compat || (args != (PyObject*)NULL)); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
212 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
|
213 |
|
17997
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
214 while (endfmt == 0) { |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
215 int c = *format++; |
|
17997
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
216 switch (c) { |
|
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
217 case '(': |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
218 if (level == 0) |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
219 max++; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
220 level++; |
|
39408
9d089aa58e2f
Introduce an upper bound on tuple nesting depth in
Georg Brandl <georg@python.org>
parents:
39189
diff
changeset
|
221 if (level >= 30) |
|
9d089aa58e2f
Introduce an upper bound on tuple nesting depth in
Georg Brandl <georg@python.org>
parents:
39189
diff
changeset
|
222 Py_FatalError("too many tuple nesting levels " |
|
9d089aa58e2f
Introduce an upper bound on tuple nesting depth in
Georg Brandl <georg@python.org>
parents:
39189
diff
changeset
|
223 "in argument format string"); |
|
17997
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
224 break; |
|
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
225 case ')': |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
226 if (level == 0) |
|
17997
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
227 Py_FatalError("excess ')' in getargs format"); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
228 else |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
229 level--; |
|
17997
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
230 break; |
|
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
231 case '\0': |
|
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
232 endfmt = 1; |
|
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
233 break; |
|
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
234 case ':': |
|
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
235 fname = format; |
|
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
236 endfmt = 1; |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
237 break; |
|
17997
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
238 case ';': |
|
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
239 message = format; |
|
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
240 endfmt = 1; |
|
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
241 break; |
|
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
242 default: |
|
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
243 if (level == 0) { |
|
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
244 if (c == 'O') |
|
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
245 max++; |
|
36090
8cb686dd6e64
Fix SF bug #1072182, problems with signed characters.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35999
diff
changeset
|
246 else if (isalpha(Py_CHARMASK(c))) { |
|
17997
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
247 if (c != 'e') /* skip encoded */ |
|
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
248 max++; |
|
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
249 } else if (c == '|') |
|
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
250 min = max; |
|
27f2422ea335
Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17996
diff
changeset
|
251 } |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
252 break; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
253 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
254 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
255 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
256 if (level != 0) |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
257 Py_FatalError(/* '(' */ "missing ')' in getargs format"); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
258 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
259 if (min < 0) |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
260 min = max; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
261 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
262 format = formatsave; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
263 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
264 if (compat) { |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
265 if (max == 0) { |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
266 if (args == NULL) |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
267 return 1; |
|
21074
47ea73fd7e6b
Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
268 PyOS_snprintf(msgbuf, sizeof(msgbuf), |
|
47ea73fd7e6b
Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
269 "%.200s%s takes no arguments", |
|
47ea73fd7e6b
Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
270 fname==NULL ? "function" : fname, |
|
47ea73fd7e6b
Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
271 fname==NULL ? "" : "()"); |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
272 PyErr_SetString(PyExc_TypeError, msgbuf); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
273 return 0; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
274 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
275 else if (min == 1 && max == 1) { |
|
2004
7f8719a36662
prevent core dump for old getargs() with NULL arg
Guido van Rossum <guido@python.org>
parents:
1913
diff
changeset
|
276 if (args == NULL) { |
|
21074
47ea73fd7e6b
Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
277 PyOS_snprintf(msgbuf, sizeof(msgbuf), |
|
47ea73fd7e6b
Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
278 "%.200s%s takes at least one argument", |
|
47ea73fd7e6b
Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
279 fname==NULL ? "function" : fname, |
|
47ea73fd7e6b
Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
280 fname==NULL ? "" : "()"); |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
281 PyErr_SetString(PyExc_TypeError, msgbuf); |
|
2004
7f8719a36662
prevent core dump for old getargs() with NULL arg
Guido van Rossum <guido@python.org>
parents:
1913
diff
changeset
|
282 return 0; |
|
7f8719a36662
prevent core dump for old getargs() with NULL arg
Guido van Rossum <guido@python.org>
parents:
1913
diff
changeset
|
283 } |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
284 msg = convertitem(args, &format, p_va, flags, levels, |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
285 msgbuf, sizeof(msgbuf), &freelist); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
286 if (msg == NULL) |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
287 return cleanreturn(1, freelist); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
288 seterror(levels[0], msg, levels+1, fname, message); |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
289 return cleanreturn(0, freelist); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
290 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
291 else { |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
292 PyErr_SetString(PyExc_SystemError, |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
293 "old style getargs format uses new features"); |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
294 return 0; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
295 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
296 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
297 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
298 if (!PyTuple_Check(args)) { |
|
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
299 PyErr_SetString(PyExc_SystemError, |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
300 "new style getargs format but argument is not a tuple"); |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
301 return 0; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
302 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
303 |
|
17856
2807949e0ba5
vgetargs1() and vgetargskeywords(): Replace uses of PyTuple_Size() and
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17817
diff
changeset
|
304 len = PyTuple_GET_SIZE(args); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
305 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
306 if (len < min || max < len) { |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
307 if (message == NULL) { |
|
21074
47ea73fd7e6b
Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
308 PyOS_snprintf(msgbuf, sizeof(msgbuf), |
|
47ea73fd7e6b
Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
309 "%.150s%s takes %s %d argument%s " |
|
36605
cab36aaee2e3
Fix compiler warning on amd64. We can't use zd here since this is
Neal Norwitz <nnorwitz@gmail.com>
parents:
36521
diff
changeset
|
310 "(%ld given)", |
|
21074
47ea73fd7e6b
Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
311 fname==NULL ? "function" : fname, |
|
47ea73fd7e6b
Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
312 fname==NULL ? "" : "()", |
|
47ea73fd7e6b
Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
313 min==max ? "exactly" |
|
47ea73fd7e6b
Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
314 : len < min ? "at least" : "at most", |
|
47ea73fd7e6b
Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
315 len < min ? min : max, |
|
47ea73fd7e6b
Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
316 (len < min ? min : max) == 1 ? "" : "s", |
|
36625
bddc13d57b88
Based on discussion with Martin and Thomas on python-checkins
Neal Norwitz <nnorwitz@gmail.com>
parents:
36605
diff
changeset
|
317 Py_SAFE_DOWNCAST(len, Py_ssize_t, long)); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
318 message = msgbuf; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
319 } |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
320 PyErr_SetString(PyExc_TypeError, message); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
321 return 0; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
322 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
323 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
324 for (i = 0; i < len; i++) { |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
325 if (*format == '|') |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
326 format++; |
|
17856
2807949e0ba5
vgetargs1() and vgetargskeywords(): Replace uses of PyTuple_Size() and
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17817
diff
changeset
|
327 msg = convertitem(PyTuple_GET_ITEM(args, i), &format, p_va, |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
328 flags, levels, msgbuf, |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
329 sizeof(msgbuf), &freelist); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
330 if (msg) { |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
331 seterror(i+1, msg, levels, fname, message); |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
332 return cleanreturn(0, freelist); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
333 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
334 } |
|
6805
93e480dedcf0
Add explicit check for correct next character in format at end of
Guido van Rossum <guido@python.org>
parents:
5410
diff
changeset
|
335 |
| 36093 | 336 if (*format != '\0' && !isalpha(Py_CHARMASK(*format)) && |
|
6923
74ad26825060
Oops -- '(' is also a legal start character of a new format...
Guido van Rossum <guido@python.org>
parents:
6805
diff
changeset
|
337 *format != '(' && |
|
6805
93e480dedcf0
Add explicit check for correct next character in format at end of
Guido van Rossum <guido@python.org>
parents:
5410
diff
changeset
|
338 *format != '|' && *format != ':' && *format != ';') { |
|
93e480dedcf0
Add explicit check for correct next character in format at end of
Guido van Rossum <guido@python.org>
parents:
5410
diff
changeset
|
339 PyErr_Format(PyExc_SystemError, |
|
7120
0efed4d3323b
Protect PyErr_Format format string argument from overflow (ironically,
Guido van Rossum <guido@python.org>
parents:
6923
diff
changeset
|
340 "bad format string: %.200s", formatsave); |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
341 return cleanreturn(0, freelist); |
|
6805
93e480dedcf0
Add explicit check for correct next character in format at end of
Guido van Rossum <guido@python.org>
parents:
5410
diff
changeset
|
342 } |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
343 |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
344 return cleanreturn(1, freelist); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
345 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
346 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
347 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
348 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
349 static void |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
350 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
|
351 const char *message) |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
352 { |
|
21066
225c7dd17e37
Fixes for possible buffer overflows in sprintf() usages.
Marc-André Lemburg <mal@egenix.com>
parents:
20723
diff
changeset
|
353 char buf[512]; |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
354 int i; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
355 char *p = buf; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
356 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
357 if (PyErr_Occurred()) |
|
2210
e734c7235727
don't overwrite error already set (e.g. from O&)
Guido van Rossum <guido@python.org>
parents:
2062
diff
changeset
|
358 return; |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
359 else if (message == NULL) { |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
360 if (fname != NULL) { |
|
21092
53270d281bf0
Use PyOS_snprintf() at some cost even though it was correct before.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21074
diff
changeset
|
361 PyOS_snprintf(p, sizeof(buf), "%.200s() ", fname); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
362 p += strlen(p); |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
363 } |
|
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
|
364 if (iarg != 0) { |
|
21145
87fa6e9bd77e
mysnprintf.c: Massive rewrite of PyOS_snprintf and PyOS_vsnprintf, to
Tim Peters <tim.peters@gmail.com>
parents:
21100
diff
changeset
|
365 PyOS_snprintf(p, sizeof(buf) - (p - buf), |
|
21092
53270d281bf0
Use PyOS_snprintf() at some cost even though it was correct before.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21074
diff
changeset
|
366 "argument %d", iarg); |
|
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
|
367 i = 0; |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
368 p += strlen(p); |
|
39189
17d5671fffcc
Part of bug #1523610: fix miscalculation of buffer length.
Georg Brandl <georg@python.org>
parents:
38666
diff
changeset
|
369 while (levels[i] > 0 && i < 32 && (int)(p-buf) < 220) { |
|
17d5671fffcc
Part of bug #1523610: fix miscalculation of buffer length.
Georg Brandl <georg@python.org>
parents:
38666
diff
changeset
|
370 PyOS_snprintf(p, sizeof(buf) - (p - buf), |
|
21092
53270d281bf0
Use PyOS_snprintf() at some cost even though it was correct before.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21074
diff
changeset
|
371 ", item %d", levels[i]-1); |
|
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
|
372 p += strlen(p); |
|
152814f6cd11
This patch makes sure that the function name always appears in the error
Ka-Ping Yee <ping@zesty.ca>
parents:
15502
diff
changeset
|
373 i++; |
|
152814f6cd11
This patch makes sure that the function name always appears in the error
Ka-Ping Yee <ping@zesty.ca>
parents:
15502
diff
changeset
|
374 } |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
375 } |
|
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
|
376 else { |
|
21145
87fa6e9bd77e
mysnprintf.c: Massive rewrite of PyOS_snprintf and PyOS_vsnprintf, to
Tim Peters <tim.peters@gmail.com>
parents:
21100
diff
changeset
|
377 PyOS_snprintf(p, sizeof(buf) - (p - buf), "argument"); |
|
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
|
378 p += strlen(p); |
|
152814f6cd11
This patch makes sure that the function name always appears in the error
Ka-Ping Yee <ping@zesty.ca>
parents:
15502
diff
changeset
|
379 } |
|
21145
87fa6e9bd77e
mysnprintf.c: Massive rewrite of PyOS_snprintf and PyOS_vsnprintf, to
Tim Peters <tim.peters@gmail.com>
parents:
21100
diff
changeset
|
380 PyOS_snprintf(p, sizeof(buf) - (p - buf), " %.256s", msg); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
381 message = buf; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
382 } |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
383 PyErr_SetString(PyExc_TypeError, message); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
384 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
385 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
386 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
387 /* Convert a tuple argument. |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
388 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
|
389 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
|
390 If successful: |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
391 *p_format and *p_va are updated, |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
392 *levels and *msgbuf are untouched, |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
393 and NULL is returned. |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
394 If the argument is invalid: |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
395 *p_format is unchanged, |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
396 *p_va is undefined, |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
397 *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
|
398 *msgbuf contains an error message, whose format is: |
|
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
|
399 "must be <typename1>, not <typename2>", where: |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
400 <typename1> is the name of the expected type, and |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
401 <typename2> is the name of the actual type, |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
402 and msgbuf is returned. |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
403 */ |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
404 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
405 static char * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
406 converttuple(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
|
407 int *levels, char *msgbuf, size_t bufsize, int toplevel, |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
408 PyObject **freelist) |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
409 { |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
410 int level = 0; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
411 int n = 0; |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
412 const char *format = *p_format; |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
413 int i; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
414 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
415 for (;;) { |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
416 int c = *format++; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
417 if (c == '(') { |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
418 if (level == 0) |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
419 n++; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
420 level++; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
421 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
422 else if (c == ')') { |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
423 if (level == 0) |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
424 break; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
425 level--; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
426 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
427 else if (c == ':' || c == ';' || c == '\0') |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
428 break; |
|
36090
8cb686dd6e64
Fix SF bug #1072182, problems with signed characters.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35999
diff
changeset
|
429 else if (level == 0 && isalpha(Py_CHARMASK(c))) |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
430 n++; |
|
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 |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
433 if (!PySequence_Check(arg) || PyString_Check(arg)) { |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
434 levels[0] = 0; |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
435 PyOS_snprintf(msgbuf, bufsize, |
|
21074
47ea73fd7e6b
Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
436 toplevel ? "expected %d arguments, not %.50s" : |
|
47ea73fd7e6b
Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
437 "must be %d-item sequence, not %.50s", |
|
47ea73fd7e6b
Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
438 n, |
|
47ea73fd7e6b
Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
439 arg == Py_None ? "None" : arg->ob_type->tp_name); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
440 return msgbuf; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
441 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
442 |
|
13576
61e4c29d53d8
replace PyXXX_Length calls with PyXXX_Size calls
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
13447
diff
changeset
|
443 if ((i = PySequence_Size(arg)) != n) { |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
444 levels[0] = 0; |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
445 PyOS_snprintf(msgbuf, bufsize, |
|
21074
47ea73fd7e6b
Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
446 toplevel ? "expected %d arguments, not %d" : |
|
47ea73fd7e6b
Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
447 "must be sequence of length %d, not %d", |
|
47ea73fd7e6b
Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
448 n, i); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
449 return msgbuf; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
450 } |
|
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
|
451 |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
452 format = *p_format; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
453 for (i = 0; i < n; i++) { |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
454 char *msg; |
|
10220
0ef1071cb7fe
Patch by Tommy Burnette to accept an arbitrary sequence when "(...)"
Guido van Rossum <guido@python.org>
parents:
9949
diff
changeset
|
455 PyObject *item; |
|
0ef1071cb7fe
Patch by Tommy Burnette to accept an arbitrary sequence when "(...)"
Guido van Rossum <guido@python.org>
parents:
9949
diff
changeset
|
456 item = PySequence_GetItem(arg, i); |
|
39189
17d5671fffcc
Part of bug #1523610: fix miscalculation of buffer length.
Georg Brandl <georg@python.org>
parents:
38666
diff
changeset
|
457 if (item == NULL) { |
|
17d5671fffcc
Part of bug #1523610: fix miscalculation of buffer length.
Georg Brandl <georg@python.org>
parents:
38666
diff
changeset
|
458 PyErr_Clear(); |
|
17d5671fffcc
Part of bug #1523610: fix miscalculation of buffer length.
Georg Brandl <georg@python.org>
parents:
38666
diff
changeset
|
459 levels[0] = i+1; |
|
17d5671fffcc
Part of bug #1523610: fix miscalculation of buffer length.
Georg Brandl <georg@python.org>
parents:
38666
diff
changeset
|
460 levels[1] = 0; |
|
17d5671fffcc
Part of bug #1523610: fix miscalculation of buffer length.
Georg Brandl <georg@python.org>
parents:
38666
diff
changeset
|
461 strncpy(msgbuf, "is not retrievable", bufsize); |
|
17d5671fffcc
Part of bug #1523610: fix miscalculation of buffer length.
Georg Brandl <georg@python.org>
parents:
38666
diff
changeset
|
462 return msgbuf; |
|
17d5671fffcc
Part of bug #1523610: fix miscalculation of buffer length.
Georg Brandl <georg@python.org>
parents:
38666
diff
changeset
|
463 } |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
464 msg = convertitem(item, &format, p_va, flags, levels+1, |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
465 msgbuf, bufsize, freelist); |
|
10220
0ef1071cb7fe
Patch by Tommy Burnette to accept an arbitrary sequence when "(...)"
Guido van Rossum <guido@python.org>
parents:
9949
diff
changeset
|
466 /* PySequence_GetItem calls tp->sq_item, which INCREFs */ |
|
0ef1071cb7fe
Patch by Tommy Burnette to accept an arbitrary sequence when "(...)"
Guido van Rossum <guido@python.org>
parents:
9949
diff
changeset
|
467 Py_XDECREF(item); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
468 if (msg != NULL) { |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
469 levels[0] = i+1; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
470 return msg; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
471 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
472 } |
|
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
|
473 |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
474 *p_format = format; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
475 return NULL; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
476 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
477 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
478 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
479 /* Convert a single item. */ |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
480 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
481 static char * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
482 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
|
483 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
|
484 { |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
485 char *msg; |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
486 const char *format = *p_format; |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
487 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
488 if (*format == '(' /* ')' */) { |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
489 format++; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
490 msg = converttuple(arg, &format, p_va, flags, levels, msgbuf, |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
491 bufsize, 0, freelist); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
492 if (msg == NULL) |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
493 format++; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
494 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
495 else { |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
496 msg = convertsimple(arg, &format, p_va, flags, |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
497 msgbuf, bufsize, freelist); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
498 if (msg != NULL) |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
499 levels[0] = 0; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
500 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
501 if (msg == NULL) |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
502 *p_format = format; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
503 return msg; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
504 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
505 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
506 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
507 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
508 #define UNICODE_DEFAULT_ENCODING(arg) \ |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
509 _PyUnicode_AsDefaultEncodedString(arg, NULL) |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
510 |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
511 /* 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
|
512 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
513 static char * |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
514 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
|
515 { |
|
19820
fe5ec1a3a7e0
Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19533
diff
changeset
|
516 assert(expected != NULL); |
|
fe5ec1a3a7e0
Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19533
diff
changeset
|
517 assert(arg != NULL); |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
518 PyOS_snprintf(msgbuf, bufsize, |
|
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
519 "must be %.50s, not %.50s", expected, |
|
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
520 arg == Py_None ? "None" : arg->ob_type->tp_name); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
521 return msgbuf; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
522 } |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
523 |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
524 #define CONV_UNICODE "(unicode conversion error)" |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
525 |
|
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
|
526 /* explicitly check for float arguments when integers are expected. For now |
|
9e47f9ed49f6
If a float is passed where a int is expected, issue a DeprecationWarning
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
27363
diff
changeset
|
527 * signal a warning. Returns true if an exception was raised. */ |
|
9e47f9ed49f6
If a float is passed where a int is expected, issue a DeprecationWarning
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
27363
diff
changeset
|
528 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
|
529 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
|
530 { |
|
9e47f9ed49f6
If a float is passed where a int is expected, issue a DeprecationWarning
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
27363
diff
changeset
|
531 if (PyFloat_Check(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
|
532 PyErr_Warn(PyExc_DeprecationWarning, |
|
9e47f9ed49f6
If a float is passed where a int is expected, issue a DeprecationWarning
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
27363
diff
changeset
|
533 "integer argument expected, got float" )) |
|
9e47f9ed49f6
If a float is passed where a int is expected, issue a DeprecationWarning
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
27363
diff
changeset
|
534 return 1; |
|
9e47f9ed49f6
If a float is passed where a int is expected, issue a DeprecationWarning
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
27363
diff
changeset
|
535 else |
|
9e47f9ed49f6
If a float is passed where a int is expected, issue a DeprecationWarning
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
27363
diff
changeset
|
536 return 0; |
|
9e47f9ed49f6
If a float is passed where a int is expected, issue a DeprecationWarning
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
27363
diff
changeset
|
537 } |
|
9e47f9ed49f6
If a float is passed where a int is expected, issue a DeprecationWarning
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
27363
diff
changeset
|
538 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
539 /* 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
|
540 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
|
541 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
|
542 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
|
543 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
|
544 |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
545 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
|
546 */ |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
547 |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
548 static char * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
549 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
|
550 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
|
551 { |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
552 /* For # codes */ |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
553 #define FETCH_SIZE int *q=NULL;Py_ssize_t *q2=NULL;\ |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
554 if (flags & FLAG_SIZE_T) q2=va_arg(*p_va, Py_ssize_t*); \ |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
555 else q=va_arg(*p_va, int*); |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
556 #define STORE_SIZE(s) if (flags & FLAG_SIZE_T) *q2=s; else *q=s; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
557 #define BUFFER_LEN ((flags & FLAG_SIZE_T) ? *q2:*q) |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
558 |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
559 const char *format = *p_format; |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
560 char c = *format++; |
|
26321
680360e68a06
Wrap uargs declaration in a #ifdef Py_USING_UNICODE, so that
Walter Dörwald <walter@livinglogic.de>
parents:
24400
diff
changeset
|
561 #ifdef Py_USING_UNICODE |
|
19820
fe5ec1a3a7e0
Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19533
diff
changeset
|
562 PyObject *uarg; |
|
26321
680360e68a06
Wrap uargs declaration in a #ifdef Py_USING_UNICODE, so that
Walter Dörwald <walter@livinglogic.de>
parents:
24400
diff
changeset
|
563 #endif |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
564 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
565 switch (c) { |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
566 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
567 case 'b': { /* unsigned byte -- very short int */ |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
568 char *p = va_arg(*p_va, char *); |
|
27363
eb1e529fdfdf
Raise a TypeError if a float is passed when an integer is specified.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
26321
diff
changeset
|
569 long ival; |
|
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
|
570 if (float_argument_error(arg)) |
| 33013 | 571 return converterr("integer<b>", arg, msgbuf, bufsize); |
|
27363
eb1e529fdfdf
Raise a TypeError if a float is passed when an integer is specified.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
26321
diff
changeset
|
572 ival = PyInt_AsLong(arg); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
573 if (ival == -1 && PyErr_Occurred()) |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
574 return converterr("integer<b>", arg, msgbuf, bufsize); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
575 else if (ival < 0) { |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
576 PyErr_SetString(PyExc_OverflowError, |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
577 "unsigned byte integer is less than minimum"); |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
578 return converterr("integer<b>", arg, msgbuf, bufsize); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
579 } |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
580 else if (ival > UCHAR_MAX) { |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
581 PyErr_SetString(PyExc_OverflowError, |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
582 "unsigned byte integer is greater than maximum"); |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
583 return converterr("integer<b>", arg, msgbuf, bufsize); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
584 } |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
585 else |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
586 *p = (unsigned char) ival; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
587 break; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
588 } |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
589 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
590 case 'B': {/* byte sized bitfield - both signed and unsigned |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
591 values allowed */ |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
592 char *p = va_arg(*p_va, char *); |
|
27363
eb1e529fdfdf
Raise a TypeError if a float is passed when an integer is specified.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
26321
diff
changeset
|
593 long ival; |
|
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
|
594 if (float_argument_error(arg)) |
| 33013 | 595 return converterr("integer<B>", arg, msgbuf, bufsize); |
|
28652
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
596 ival = PyInt_AsUnsignedLongMask(arg); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
597 if (ival == -1 && PyErr_Occurred()) |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
598 return converterr("integer<B>", arg, msgbuf, bufsize); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
599 else |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
600 *p = (unsigned char) ival; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
601 break; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
602 } |
|
13872
35fc9511a36f
Changed H specifier to mean "bitfield", i.e. any value from
Jack Jansen <jack.jansen@cwi.nl>
parents:
13837
diff
changeset
|
603 |
|
28667
5bfdbc0fd172
Roll back changes to 'h' format code -- too much breaks. Other
Guido van Rossum <guido@python.org>
parents:
28652
diff
changeset
|
604 case 'h': {/* signed short int */ |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
605 short *p = va_arg(*p_va, short *); |
|
27363
eb1e529fdfdf
Raise a TypeError if a float is passed when an integer is specified.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
26321
diff
changeset
|
606 long ival; |
|
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
|
607 if (float_argument_error(arg)) |
| 33013 | 608 return converterr("integer<h>", arg, msgbuf, bufsize); |
|
27363
eb1e529fdfdf
Raise a TypeError if a float is passed when an integer is specified.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
26321
diff
changeset
|
609 ival = PyInt_AsLong(arg); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
610 if (ival == -1 && PyErr_Occurred()) |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
611 return converterr("integer<h>", arg, msgbuf, bufsize); |
|
28667
5bfdbc0fd172
Roll back changes to 'h' format code -- too much breaks. Other
Guido van Rossum <guido@python.org>
parents:
28652
diff
changeset
|
612 else if (ival < SHRT_MIN) { |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
613 PyErr_SetString(PyExc_OverflowError, |
|
28667
5bfdbc0fd172
Roll back changes to 'h' format code -- too much breaks. Other
Guido van Rossum <guido@python.org>
parents:
28652
diff
changeset
|
614 "signed short integer is less than minimum"); |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
615 return converterr("integer<h>", arg, msgbuf, bufsize); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
616 } |
|
28667
5bfdbc0fd172
Roll back changes to 'h' format code -- too much breaks. Other
Guido van Rossum <guido@python.org>
parents:
28652
diff
changeset
|
617 else if (ival > SHRT_MAX) { |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
618 PyErr_SetString(PyExc_OverflowError, |
|
28667
5bfdbc0fd172
Roll back changes to 'h' format code -- too much breaks. Other
Guido van Rossum <guido@python.org>
parents:
28652
diff
changeset
|
619 "signed short integer is greater than maximum"); |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
620 return converterr("integer<h>", arg, msgbuf, bufsize); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
621 } |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
622 else |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
623 *p = (short) ival; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
624 break; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
625 } |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
626 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
627 case 'H': { /* short int sized bitfield, both signed and |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
628 unsigned allowed */ |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
629 unsigned short *p = va_arg(*p_va, unsigned short *); |
|
27363
eb1e529fdfdf
Raise a TypeError if a float is passed when an integer is specified.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
26321
diff
changeset
|
630 long ival; |
|
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
|
631 if (float_argument_error(arg)) |
| 33013 | 632 return converterr("integer<H>", arg, msgbuf, bufsize); |
|
28652
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
633 ival = PyInt_AsUnsignedLongMask(arg); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
634 if (ival == -1 && PyErr_Occurred()) |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
635 return converterr("integer<H>", arg, msgbuf, bufsize); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
636 else |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
637 *p = (unsigned short) ival; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
638 break; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
639 } |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
640 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
641 case 'i': {/* signed int */ |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
642 int *p = va_arg(*p_va, int *); |
|
27363
eb1e529fdfdf
Raise a TypeError if a float is passed when an integer is specified.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
26321
diff
changeset
|
643 long ival; |
|
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
|
644 if (float_argument_error(arg)) |
| 33013 | 645 return converterr("integer<i>", arg, msgbuf, bufsize); |
|
27363
eb1e529fdfdf
Raise a TypeError if a float is passed when an integer is specified.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
26321
diff
changeset
|
646 ival = PyInt_AsLong(arg); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
647 if (ival == -1 && PyErr_Occurred()) |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
648 return converterr("integer<i>", arg, msgbuf, bufsize); |
|
38666
e2ba5ae4b813
Argh. "integer" is a very confusing word ;)
Georg Brandl <georg@python.org>
parents:
38661
diff
changeset
|
649 else if (ival > INT_MAX) { |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
650 PyErr_SetString(PyExc_OverflowError, |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
651 "signed integer is greater than maximum"); |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
652 return converterr("integer<i>", arg, msgbuf, bufsize); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
653 } |
|
38666
e2ba5ae4b813
Argh. "integer" is a very confusing word ;)
Georg Brandl <georg@python.org>
parents:
38661
diff
changeset
|
654 else if (ival < INT_MIN) { |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
655 PyErr_SetString(PyExc_OverflowError, |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
656 "signed integer is less than minimum"); |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
657 return converterr("integer<i>", arg, msgbuf, bufsize); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
658 } |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
659 else |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
660 *p = ival; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
661 break; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
662 } |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
663 |
|
28652
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
664 case 'I': { /* int sized bitfield, both signed and |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
665 unsigned allowed */ |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
666 unsigned int *p = va_arg(*p_va, unsigned int *); |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
667 unsigned int ival; |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
668 if (float_argument_error(arg)) |
| 33013 | 669 return converterr("integer<I>", arg, msgbuf, bufsize); |
|
37820
6eb86a71f5c8
C++ compiler cleanup: cast...
Skip Montanaro <skip@pobox.com>
parents:
37702
diff
changeset
|
670 ival = (unsigned int)PyInt_AsUnsignedLongMask(arg); |
|
6eb86a71f5c8
C++ compiler cleanup: cast...
Skip Montanaro <skip@pobox.com>
parents:
37702
diff
changeset
|
671 if (ival == (unsigned int)-1 && PyErr_Occurred()) |
|
28652
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
672 return converterr("integer<I>", arg, msgbuf, bufsize); |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
673 else |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
674 *p = ival; |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
675 break; |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
676 } |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
677 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
678 case 'n': /* Py_ssize_t */ |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
679 #if SIZEOF_SIZE_T != SIZEOF_LONG |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
680 { |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
681 Py_ssize_t *p = va_arg(*p_va, Py_ssize_t *); |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
682 Py_ssize_t ival; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
683 if (float_argument_error(arg)) |
|
37674
a4231aa3201a
Add a test for Py_ssize_t. Correct typo in getargs.c.
Georg Brandl <georg@python.org>
parents:
37619
diff
changeset
|
684 return converterr("integer<n>", arg, msgbuf, bufsize); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
685 ival = PyInt_AsSsize_t(arg); |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
686 if (ival == -1 && PyErr_Occurred()) |
|
37674
a4231aa3201a
Add a test for Py_ssize_t. Correct typo in getargs.c.
Georg Brandl <georg@python.org>
parents:
37619
diff
changeset
|
687 return converterr("integer<n>", arg, msgbuf, bufsize); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
688 *p = ival; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
689 break; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
690 } |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
691 #endif |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
692 /* Fall through from 'n' to 'l' if Py_ssize_t is int */ |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
693 case 'l': {/* long int */ |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
694 long *p = va_arg(*p_va, long *); |
|
27363
eb1e529fdfdf
Raise a TypeError if a float is passed when an integer is specified.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
26321
diff
changeset
|
695 long ival; |
|
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
|
696 if (float_argument_error(arg)) |
| 33013 | 697 return converterr("integer<l>", arg, msgbuf, bufsize); |
|
27363
eb1e529fdfdf
Raise a TypeError if a float is passed when an integer is specified.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
26321
diff
changeset
|
698 ival = PyInt_AsLong(arg); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
699 if (ival == -1 && PyErr_Occurred()) |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
700 return converterr("integer<l>", arg, msgbuf, bufsize); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
701 else |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
702 *p = ival; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
703 break; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
704 } |
|
28652
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
705 |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
706 case 'k': { /* long sized bitfield */ |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
707 unsigned long *p = va_arg(*p_va, unsigned long *); |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
708 unsigned long ival; |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
709 if (PyInt_Check(arg)) |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
710 ival = PyInt_AsUnsignedLongMask(arg); |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
711 else if (PyLong_Check(arg)) |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
712 ival = PyLong_AsUnsignedLongMask(arg); |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
713 else |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
714 return converterr("integer<k>", arg, msgbuf, bufsize); |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
715 *p = ival; |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
716 break; |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
717 } |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
718 |
|
9949
98e37347378b
Change rare occurrences of #if HAVE_LONG_LONG to #ifdef.
Guido van Rossum <guido@python.org>
parents:
9306
diff
changeset
|
719 #ifdef HAVE_LONG_LONG |
|
28437
871da703e4c0
Rename LONG_LONG to PY_LONG_LONG. Fixes #710285.
Martin v. Löwis <martin@v.loewis.de>
parents:
27685
diff
changeset
|
720 case 'L': {/* PY_LONG_LONG */ |
|
871da703e4c0
Rename LONG_LONG to PY_LONG_LONG. Fixes #710285.
Martin v. Löwis <martin@v.loewis.de>
parents:
27685
diff
changeset
|
721 PY_LONG_LONG *p = va_arg( *p_va, PY_LONG_LONG * ); |
|
871da703e4c0
Rename LONG_LONG to PY_LONG_LONG. Fixes #710285.
Martin v. Löwis <martin@v.loewis.de>
parents:
27685
diff
changeset
|
722 PY_LONG_LONG ival = PyLong_AsLongLong( arg ); |
|
45530
bf1ab3bf799c
Whitespace normalization
Neal Norwitz <nnorwitz@gmail.com>
parents:
44072
diff
changeset
|
723 if (ival == (PY_LONG_LONG)-1 && PyErr_Occurred() ) { |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
724 return converterr("long<L>", arg, msgbuf, bufsize); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
725 } else { |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
726 *p = ival; |
|
8822
bd47ee068b83
Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
8358
diff
changeset
|
727 } |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
728 break; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
729 } |
|
28652
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
730 |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
731 case 'K': { /* long long sized bitfield */ |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
732 unsigned PY_LONG_LONG *p = va_arg(*p_va, unsigned PY_LONG_LONG *); |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
733 unsigned PY_LONG_LONG ival; |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
734 if (PyInt_Check(arg)) |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
735 ival = PyInt_AsUnsignedLongMask(arg); |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
736 else if (PyLong_Check(arg)) |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
737 ival = PyLong_AsUnsignedLongLongMask(arg); |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
738 else |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
739 return converterr("integer<K>", arg, msgbuf, bufsize); |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
740 *p = ival; |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
741 break; |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
742 } |
|
8822
bd47ee068b83
Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
8358
diff
changeset
|
743 #endif |
|
bd47ee068b83
Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
8358
diff
changeset
|
744 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
745 case 'f': {/* float */ |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
746 float *p = va_arg(*p_va, float *); |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
747 double dval = PyFloat_AsDouble(arg); |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
748 if (PyErr_Occurred()) |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
749 return converterr("float<f>", arg, msgbuf, bufsize); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
750 else |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
751 *p = (float) dval; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
752 break; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
753 } |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
754 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
755 case 'd': {/* double */ |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
756 double *p = va_arg(*p_va, double *); |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
757 double dval = PyFloat_AsDouble(arg); |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
758 if (PyErr_Occurred()) |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
759 return converterr("float<d>", arg, msgbuf, bufsize); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
760 else |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
761 *p = dval; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
762 break; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
763 } |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
764 |
|
3766
516490c8192c
Py_complex; and WITHOUT_COMPLEX added to getargs.c
Guido van Rossum <guido@python.org>
parents:
3323
diff
changeset
|
765 #ifndef WITHOUT_COMPLEX |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
766 case 'D': {/* complex double */ |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
767 Py_complex *p = va_arg(*p_va, Py_complex *); |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
768 Py_complex cval; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
769 cval = PyComplex_AsCComplex(arg); |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
770 if (PyErr_Occurred()) |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
771 return converterr("complex<D>", arg, msgbuf, bufsize); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
772 else |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
773 *p = cval; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
774 break; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
775 } |
|
3766
516490c8192c
Py_complex; and WITHOUT_COMPLEX added to getargs.c
Guido van Rossum <guido@python.org>
parents:
3323
diff
changeset
|
776 #endif /* WITHOUT_COMPLEX */ |
|
3323
6098aaa8ae7f
changes for complex numbers
Guido van Rossum <guido@python.org>
parents:
2210
diff
changeset
|
777 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
778 case 'c': {/* char */ |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
779 char *p = va_arg(*p_va, char *); |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
780 if (PyString_Check(arg) && PyString_Size(arg) == 1) |
|
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
781 *p = PyString_AS_STRING(arg)[0]; |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
782 else |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
783 return converterr("char", arg, msgbuf, bufsize); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
784 break; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
785 } |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
786 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
787 case 's': {/* string */ |
|
48221
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
788 if (*format == '*') { |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
789 Py_buffer *p = (Py_buffer *)va_arg(*p_va, Py_buffer *); |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
790 |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
791 if (PyString_Check(arg)) { |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
792 PyBuffer_FillInfo(p, arg, |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
793 PyString_AS_STRING(arg), PyString_GET_SIZE(arg), |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
794 1, 0); |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
795 } |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
796 #ifdef Py_USING_UNICODE |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
797 else if (PyUnicode_Check(arg)) { |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
798 uarg = UNICODE_DEFAULT_ENCODING(arg); |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
799 if (uarg == NULL) |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
800 return converterr(CONV_UNICODE, |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
801 arg, msgbuf, bufsize); |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
802 PyBuffer_FillInfo(p, arg, |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
803 PyString_AS_STRING(uarg), PyString_GET_SIZE(uarg), |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
804 1, 0); |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
805 } |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
806 #endif |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
807 else { /* any buffer-like object */ |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
808 char *buf; |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
809 if (getbuffer(arg, p, &buf) < 0) |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
810 return converterr(buf, arg, msgbuf, bufsize); |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
811 } |
|
48889
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
812 if (addcleanup(p, freelist, cleanup_buffer)) { |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
813 return converterr( |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
814 "(cleanup problem)", |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
815 arg, msgbuf, bufsize); |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
816 } |
|
48221
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
817 format++; |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
818 } else if (*format == '#') { |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
819 void **p = (void **)va_arg(*p_va, char **); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
820 FETCH_SIZE; |
|
5410
3b2fda31bf1b
Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents:
5408
diff
changeset
|
821 |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
822 if (PyString_Check(arg)) { |
|
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
823 *p = PyString_AS_STRING(arg); |
|
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
824 STORE_SIZE(PyString_GET_SIZE(arg)); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
825 } |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18887
diff
changeset
|
826 #ifdef Py_USING_UNICODE |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
827 else if (PyUnicode_Check(arg)) { |
|
19820
fe5ec1a3a7e0
Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19533
diff
changeset
|
828 uarg = UNICODE_DEFAULT_ENCODING(arg); |
|
fe5ec1a3a7e0
Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19533
diff
changeset
|
829 if (uarg == NULL) |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
830 return converterr(CONV_UNICODE, |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
831 arg, msgbuf, bufsize); |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
832 *p = PyString_AS_STRING(uarg); |
|
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
833 STORE_SIZE(PyString_GET_SIZE(uarg)); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
834 } |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18887
diff
changeset
|
835 #endif |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
836 else { /* any buffer-like object */ |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
837 char *buf; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
838 Py_ssize_t count = convertbuffer(arg, p, &buf); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
839 if (count < 0) |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
840 return converterr(buf, arg, msgbuf, bufsize); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
841 STORE_SIZE(count); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
842 } |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
843 format++; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
844 } else { |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
845 char **p = va_arg(*p_va, char **); |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
846 |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
847 if (PyString_Check(arg)) |
|
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
848 *p = PyString_AS_STRING(arg); |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18887
diff
changeset
|
849 #ifdef Py_USING_UNICODE |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
850 else if (PyUnicode_Check(arg)) { |
|
19820
fe5ec1a3a7e0
Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19533
diff
changeset
|
851 uarg = UNICODE_DEFAULT_ENCODING(arg); |
|
fe5ec1a3a7e0
Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19533
diff
changeset
|
852 if (uarg == NULL) |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
853 return converterr(CONV_UNICODE, |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
854 arg, msgbuf, bufsize); |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
855 *p = PyString_AS_STRING(uarg); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
856 } |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18887
diff
changeset
|
857 #endif |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
858 else |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
859 return converterr("string", arg, msgbuf, bufsize); |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
860 if ((Py_ssize_t)strlen(*p) != PyString_Size(arg)) |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
861 return converterr("string without null bytes", |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
862 arg, msgbuf, bufsize); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
863 } |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
864 break; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
865 } |
|
5410
3b2fda31bf1b
Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents:
5408
diff
changeset
|
866 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
867 case 'z': {/* string, may be NULL (None) */ |
|
48221
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
868 if (*format == '*') { |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
869 Py_buffer *p = (Py_buffer *)va_arg(*p_va, Py_buffer *); |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
870 |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
871 if (arg == Py_None) |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
872 PyBuffer_FillInfo(p, NULL, NULL, 0, 1, 0); |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
873 else if (PyString_Check(arg)) { |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
874 PyBuffer_FillInfo(p, arg, |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
875 PyString_AS_STRING(arg), PyString_GET_SIZE(arg), |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
876 1, 0); |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
877 } |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
878 #ifdef Py_USING_UNICODE |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
879 else if (PyUnicode_Check(arg)) { |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
880 uarg = UNICODE_DEFAULT_ENCODING(arg); |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
881 if (uarg == NULL) |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
882 return converterr(CONV_UNICODE, |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
883 arg, msgbuf, bufsize); |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
884 PyBuffer_FillInfo(p, arg, |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
885 PyString_AS_STRING(uarg), PyString_GET_SIZE(uarg), |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
886 1, 0); |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
887 } |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
888 #endif |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
889 else { /* any buffer-like object */ |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
890 char *buf; |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
891 if (getbuffer(arg, p, &buf) < 0) |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
892 return converterr(buf, arg, msgbuf, bufsize); |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
893 } |
|
48889
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
894 if (addcleanup(p, freelist, cleanup_buffer)) { |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
895 return converterr( |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
896 "(cleanup problem)", |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
897 arg, msgbuf, bufsize); |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
898 } |
|
48221
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
899 format++; |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
900 } else if (*format == '#') { /* any buffer-like object */ |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
901 void **p = (void **)va_arg(*p_va, char **); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
902 FETCH_SIZE; |
|
5410
3b2fda31bf1b
Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents:
5408
diff
changeset
|
903 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
904 if (arg == Py_None) { |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
905 *p = 0; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
906 STORE_SIZE(0); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
907 } |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
908 else if (PyString_Check(arg)) { |
|
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
909 *p = PyString_AS_STRING(arg); |
|
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
910 STORE_SIZE(PyString_GET_SIZE(arg)); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
911 } |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18887
diff
changeset
|
912 #ifdef Py_USING_UNICODE |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
913 else if (PyUnicode_Check(arg)) { |
|
19820
fe5ec1a3a7e0
Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19533
diff
changeset
|
914 uarg = UNICODE_DEFAULT_ENCODING(arg); |
|
fe5ec1a3a7e0
Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19533
diff
changeset
|
915 if (uarg == NULL) |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
916 return converterr(CONV_UNICODE, |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
917 arg, msgbuf, bufsize); |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
918 *p = PyString_AS_STRING(uarg); |
|
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
919 STORE_SIZE(PyString_GET_SIZE(uarg)); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
920 } |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18887
diff
changeset
|
921 #endif |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
922 else { /* any buffer-like object */ |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
923 char *buf; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
924 Py_ssize_t count = convertbuffer(arg, p, &buf); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
925 if (count < 0) |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
926 return converterr(buf, arg, msgbuf, bufsize); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
927 STORE_SIZE(count); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
928 } |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
929 format++; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
930 } else { |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
931 char **p = va_arg(*p_va, char **); |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
932 |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
933 if (arg == Py_None) |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
934 *p = 0; |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
935 else if (PyString_Check(arg)) |
|
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
936 *p = PyString_AS_STRING(arg); |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18887
diff
changeset
|
937 #ifdef Py_USING_UNICODE |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
938 else if (PyUnicode_Check(arg)) { |
|
19820
fe5ec1a3a7e0
Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19533
diff
changeset
|
939 uarg = UNICODE_DEFAULT_ENCODING(arg); |
|
fe5ec1a3a7e0
Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19533
diff
changeset
|
940 if (uarg == NULL) |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
941 return converterr(CONV_UNICODE, |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
942 arg, msgbuf, bufsize); |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
943 *p = PyString_AS_STRING(uarg); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
944 } |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18887
diff
changeset
|
945 #endif |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
946 else |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
947 return converterr("string or None", |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
948 arg, msgbuf, bufsize); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
949 if (*format == '#') { |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
950 FETCH_SIZE; |
|
36773
64ff3b225d48
Fix C99-ism, and add XXX to comment
Thomas Wouters <thomas@python.org>
parents:
36758
diff
changeset
|
951 assert(0); /* XXX redundant with if-case */ |
| 12612 | 952 if (arg == Py_None) |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
953 *q = 0; |
|
5410
3b2fda31bf1b
Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents:
5408
diff
changeset
|
954 else |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
955 *q = PyString_Size(arg); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
956 format++; |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
957 } |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
958 else if (*p != NULL && |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
959 (Py_ssize_t)strlen(*p) != PyString_Size(arg)) |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
960 return converterr( |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
961 "string without null bytes or None", |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
962 arg, msgbuf, bufsize); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
963 } |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
964 break; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
965 } |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
966 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
967 case 'e': {/* encoded string */ |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
968 char **buffer; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
969 const char *encoding; |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18887
diff
changeset
|
970 PyObject *s; |
|
44072
2f47b228ba06
Issue #1521: on 64bit platforms, str.decode fails on very long strings.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
39995
diff
changeset
|
971 Py_ssize_t size; |
|
2f47b228ba06
Issue #1521: on 64bit platforms, str.decode fails on very long strings.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
39995
diff
changeset
|
972 int recode_strings; |
| 12051 | 973 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
974 /* Get 'e' parameter: the encoding name */ |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
975 encoding = (const char *)va_arg(*p_va, const char *); |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18887
diff
changeset
|
976 #ifdef Py_USING_UNICODE |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
977 if (encoding == NULL) |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
978 encoding = PyUnicode_GetDefaultEncoding(); |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18887
diff
changeset
|
979 #endif |
| 12051 | 980 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
981 /* Get output buffer parameter: |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
982 's' (recode all objects via Unicode) or |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
983 't' (only recode non-string objects) |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
984 */ |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
985 if (*format == 's') |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
986 recode_strings = 1; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
987 else if (*format == 't') |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
988 recode_strings = 0; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
989 else |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
990 return converterr( |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
991 "(unknown parser marker combination)", |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
992 arg, msgbuf, bufsize); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
993 buffer = (char **)va_arg(*p_va, char **); |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
994 format++; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
995 if (buffer == NULL) |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
996 return converterr("(buffer is NULL)", |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
997 arg, msgbuf, bufsize); |
| 12051 | 998 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
999 /* Encode object */ |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1000 if (!recode_strings && PyString_Check(arg)) { |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1001 s = arg; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1002 Py_INCREF(s); |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1003 } |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1004 else { |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18887
diff
changeset
|
1005 #ifdef Py_USING_UNICODE |
|
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18887
diff
changeset
|
1006 PyObject *u; |
|
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18887
diff
changeset
|
1007 |
| 12051 | 1008 /* Convert object to Unicode */ |
| 1009 u = PyUnicode_FromObject(arg); | |
| 1010 if (u == NULL) | |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1011 return converterr( |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1012 "string or unicode or text buffer", |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
1013 arg, msgbuf, bufsize); |
| 12051 | 1014 |
| 1015 /* Encode object; use default error handling */ | |
| 1016 s = PyUnicode_AsEncodedString(u, | |
| 1017 encoding, | |
| 1018 NULL); | |
| 1019 Py_DECREF(u); | |
| 1020 if (s == NULL) | |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1021 return converterr("(encoding failed)", |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
1022 arg, msgbuf, bufsize); |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1023 if (!PyString_Check(s)) { |
| 12051 | 1024 Py_DECREF(s); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1025 return converterr( |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1026 "(encoder failed to return a string)", |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
1027 arg, msgbuf, bufsize); |
| 12051 | 1028 } |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18887
diff
changeset
|
1029 #else |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
1030 return converterr("string<e>", arg, msgbuf, bufsize); |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18887
diff
changeset
|
1031 #endif |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1032 } |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1033 size = PyString_GET_SIZE(s); |
| 12051 | 1034 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1035 /* Write output; output is guaranteed to be 0-terminated */ |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1036 if (*format == '#') { |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1037 /* Using buffer length parameter '#': |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1038 |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1039 - if *buffer is NULL, a new buffer of the |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1040 needed size is allocated and the data |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1041 copied into it; *buffer is updated to point |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1042 to the new buffer; the caller is |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1043 responsible for PyMem_Free()ing it after |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1044 usage |
| 12051 | 1045 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1046 - if *buffer is not NULL, the data is |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1047 copied to *buffer; *buffer_len has to be |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1048 set to the size of the buffer on input; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1049 buffer overflow is signalled with an error; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1050 buffer has to provide enough room for the |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1051 encoded string plus the trailing 0-byte |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1052 |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1053 - in both cases, *buffer_len is updated to |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1054 the size of the buffer /excluding/ the |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1055 trailing 0-byte |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1056 |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1057 */ |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1058 FETCH_SIZE; |
| 12051 | 1059 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1060 format++; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1061 if (q == NULL && q2 == NULL) { |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
1062 Py_DECREF(s); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1063 return converterr( |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1064 "(buffer_len is NULL)", |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
1065 arg, msgbuf, bufsize); |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
1066 } |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1067 if (*buffer == NULL) { |
| 12051 | 1068 *buffer = PyMem_NEW(char, size + 1); |
| 1069 if (*buffer == NULL) { | |
| 1070 Py_DECREF(s); | |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1071 return converterr( |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1072 "(memory error)", |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
1073 arg, msgbuf, bufsize); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1074 } |
|
48889
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
1075 if (addcleanup(*buffer, freelist, cleanup_ptr)) { |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
1076 Py_DECREF(s); |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
1077 return converterr( |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
1078 "(cleanup problem)", |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
1079 arg, msgbuf, bufsize); |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
1080 } |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1081 } else { |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1082 if (size + 1 > BUFFER_LEN) { |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1083 Py_DECREF(s); |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1084 return converterr( |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1085 "(buffer overflow)", |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
1086 arg, msgbuf, bufsize); |
| 12051 | 1087 } |
| 1088 } | |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1089 memcpy(*buffer, |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1090 PyString_AS_STRING(s), |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1091 size + 1); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1092 STORE_SIZE(size); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1093 } else { |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1094 /* Using a 0-terminated buffer: |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1095 |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1096 - the encoded string has to be 0-terminated |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1097 for this variant to work; if it is not, an |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1098 error raised |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1099 |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1100 - a new buffer of the needed size is |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1101 allocated and the data copied into it; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1102 *buffer is updated to point to the new |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1103 buffer; the caller is responsible for |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1104 PyMem_Free()ing it after usage |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1105 |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1106 */ |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1107 if ((Py_ssize_t)strlen(PyString_AS_STRING(s)) |
|
39995
6ba402b60041
Forward-port of r52136,52138: a review of overflow-detecting code.
Armin Rigo <arigo@tunes.org>
parents:
39865
diff
changeset
|
1108 != size) { |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
1109 Py_DECREF(s); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1110 return converterr( |
|
52903
3889d9528601
Merged revisions 71058,71149-71150,71212,71214-71216,71222,71225,71234,71237-71238,71240-71241,71243,71249,71251 via svnmerge from
Georg Brandl <georg@python.org>
parents:
50305
diff
changeset
|
1111 "encoded string without NULL bytes", |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
1112 arg, msgbuf, bufsize); |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
1113 } |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1114 *buffer = PyMem_NEW(char, size + 1); |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1115 if (*buffer == NULL) { |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1116 Py_DECREF(s); |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1117 return converterr("(memory error)", |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
1118 arg, msgbuf, bufsize); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1119 } |
|
48889
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
1120 if (addcleanup(*buffer, freelist, cleanup_ptr)) { |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
1121 Py_DECREF(s); |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
1122 return converterr("(cleanup problem)", |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
1123 arg, msgbuf, bufsize); |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
1124 } |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1125 memcpy(*buffer, |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1126 PyString_AS_STRING(s), |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1127 size + 1); |
| 12051 | 1128 } |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1129 Py_DECREF(s); |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1130 break; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1131 } |
|
12570
3dbe41380266
Brian Hooper <brian_takashi@hotmail.com>:
Fred Drake <fdrake@acm.org>
parents:
12510
diff
changeset
|
1132 |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18887
diff
changeset
|
1133 #ifdef Py_USING_UNICODE |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1134 case 'u': {/* raw unicode buffer (Py_UNICODE *) */ |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1135 if (*format == '#') { /* any buffer-like object */ |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1136 void **p = (void **)va_arg(*p_va, char **); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1137 FETCH_SIZE; |
|
21667
0d3bb68e3a28
Fixed "u#" parser marker to pass through Unicode objects as-is without
Marc-André Lemburg <mal@egenix.com>
parents:
21145
diff
changeset
|
1138 if (PyUnicode_Check(arg)) { |
|
0d3bb68e3a28
Fixed "u#" parser marker to pass through Unicode objects as-is without
Marc-André Lemburg <mal@egenix.com>
parents:
21145
diff
changeset
|
1139 *p = PyUnicode_AS_UNICODE(arg); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1140 STORE_SIZE(PyUnicode_GET_SIZE(arg)); |
|
21667
0d3bb68e3a28
Fixed "u#" parser marker to pass through Unicode objects as-is without
Marc-André Lemburg <mal@egenix.com>
parents:
21145
diff
changeset
|
1141 } |
|
0d3bb68e3a28
Fixed "u#" parser marker to pass through Unicode objects as-is without
Marc-André Lemburg <mal@egenix.com>
parents:
21145
diff
changeset
|
1142 else { |
|
37697
7ee4068e2c62
SF Bug #1454485, array.array('u') could crash the interpreter when
Neal Norwitz <nnorwitz@gmail.com>
parents:
37674
diff
changeset
|
1143 return converterr("cannot convert raw buffers", |
|
7ee4068e2c62
SF Bug #1454485, array.array('u') could crash the interpreter when
Neal Norwitz <nnorwitz@gmail.com>
parents:
37674
diff
changeset
|
1144 arg, msgbuf, bufsize); |
|
21667
0d3bb68e3a28
Fixed "u#" parser marker to pass through Unicode objects as-is without
Marc-André Lemburg <mal@egenix.com>
parents:
21145
diff
changeset
|
1145 } |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1146 format++; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1147 } else { |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1148 Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **); |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1149 if (PyUnicode_Check(arg)) |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1150 *p = PyUnicode_AS_UNICODE(arg); |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1151 else |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
1152 return converterr("unicode", arg, msgbuf, bufsize); |
|
12570
3dbe41380266
Brian Hooper <brian_takashi@hotmail.com>:
Fred Drake <fdrake@acm.org>
parents:
12510
diff
changeset
|
1153 } |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1154 break; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1155 } |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18887
diff
changeset
|
1156 #endif |
|
12570
3dbe41380266
Brian Hooper <brian_takashi@hotmail.com>:
Fred Drake <fdrake@acm.org>
parents:
12510
diff
changeset
|
1157 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1158 case 'S': { /* string object */ |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1159 PyObject **p = va_arg(*p_va, PyObject **); |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1160 if (PyString_Check(arg)) |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1161 *p = arg; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1162 else |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
1163 return converterr("string", arg, msgbuf, bufsize); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1164 break; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1165 } |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1166 |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18887
diff
changeset
|
1167 #ifdef Py_USING_UNICODE |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1168 case 'U': { /* Unicode object */ |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1169 PyObject **p = va_arg(*p_va, PyObject **); |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1170 if (PyUnicode_Check(arg)) |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1171 *p = arg; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1172 else |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
1173 return converterr("unicode", arg, msgbuf, bufsize); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1174 break; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1175 } |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18887
diff
changeset
|
1176 #endif |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1177 |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1178 case 'O': { /* object */ |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1179 PyTypeObject *type; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1180 PyObject **p; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1181 if (*format == '!') { |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1182 type = va_arg(*p_va, PyTypeObject*); |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1183 p = va_arg(*p_va, PyObject **); |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1184 format++; |
|
19533
3e7897822459
The "O!" format code should implement an isinstance() test
Guido van Rossum <guido@python.org>
parents:
19343
diff
changeset
|
1185 if (PyType_IsSubtype(arg->ob_type, type)) |
|
11975
876f35828e87
Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents:
10220
diff
changeset
|
1186 *p = arg; |
|
876f35828e87
Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents:
10220
diff
changeset
|
1187 else |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
1188 return converterr(type->tp_name, arg, msgbuf, bufsize); |
|
8358
da4bdceeaad7
Another veeeeeery old patch...
Guido van Rossum <guido@python.org>
parents:
7982
diff
changeset
|
1189 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1190 } |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1191 else if (*format == '?') { |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1192 inquiry pred = va_arg(*p_va, inquiry); |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1193 p = va_arg(*p_va, PyObject **); |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1194 format++; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1195 if ((*pred)(arg)) |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1196 *p = arg; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1197 else |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1198 return converterr("(unspecified)", |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
1199 arg, msgbuf, bufsize); |
|
8358
da4bdceeaad7
Another veeeeeery old patch...
Guido van Rossum <guido@python.org>
parents:
7982
diff
changeset
|
1200 |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1201 } |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1202 else if (*format == '&') { |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1203 typedef int (*converter)(PyObject *, void *); |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1204 converter convert = va_arg(*p_va, converter); |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1205 void *addr = va_arg(*p_va, void *); |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1206 format++; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1207 if (! (*convert)(arg, addr)) |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1208 return converterr("(unspecified)", |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
1209 arg, msgbuf, bufsize); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1210 } |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1211 else { |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1212 p = va_arg(*p_va, PyObject **); |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1213 *p = arg; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1214 } |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1215 break; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1216 } |
|
5410
3b2fda31bf1b
Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents:
5408
diff
changeset
|
1217 |
|
3b2fda31bf1b
Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents:
5408
diff
changeset
|
1218 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1219 case 'w': { /* memory buffer, read-write access */ |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1220 void **p = va_arg(*p_va, void **); |
|
48221
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1221 void *res; |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1222 PyBufferProcs *pb = arg->ob_type->tp_as_buffer; |
|
44072
2f47b228ba06
Issue #1521: on 64bit platforms, str.decode fails on very long strings.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
39995
diff
changeset
|
1223 Py_ssize_t count; |
|
48221
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1224 |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1225 if (pb && pb->bf_releasebuffer && *format != '*') |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1226 /* Buffer must be released, yet caller does not use |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1227 the Py_buffer protocol. */ |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1228 return converterr("pinned buffer", arg, msgbuf, bufsize); |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1229 |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1230 if (pb && pb->bf_getbuffer && *format == '*') { |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1231 /* Caller is interested in Py_buffer, and the object |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1232 supports it directly. */ |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1233 format++; |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1234 if (pb->bf_getbuffer(arg, (Py_buffer*)p, PyBUF_WRITABLE) < 0) { |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1235 PyErr_Clear(); |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1236 return converterr("read-write buffer", arg, msgbuf, bufsize); |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1237 } |
|
48889
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
1238 if (addcleanup(p, freelist, cleanup_buffer)) { |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
1239 return converterr( |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
1240 "(cleanup problem)", |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
1241 arg, msgbuf, bufsize); |
|
bbffe0914c56
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48847
diff
changeset
|
1242 } |
|
48221
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1243 if (!PyBuffer_IsContiguous((Py_buffer*)p, 'C')) |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1244 return converterr("contiguous buffer", arg, msgbuf, bufsize); |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1245 break; |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1246 } |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1247 |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1248 if (pb == NULL || |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1249 pb->bf_getwritebuffer == NULL || |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1250 pb->bf_getsegcount == NULL) |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
1251 return converterr("read-write buffer", arg, msgbuf, bufsize); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1252 if ((*pb->bf_getsegcount)(arg, NULL) != 1) |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1253 return converterr("single-segment read-write buffer", |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
1254 arg, msgbuf, bufsize); |
|
48221
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1255 if ((count = pb->bf_getwritebuffer(arg, 0, &res)) < 0) |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
1256 return converterr("(unspecified)", arg, msgbuf, bufsize); |
|
48221
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1257 if (*format == '*') { |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1258 PyBuffer_FillInfo((Py_buffer*)p, arg, res, count, 1, 0); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1259 format++; |
|
5410
3b2fda31bf1b
Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents:
5408
diff
changeset
|
1260 } |
|
48221
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1261 else { |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1262 *p = res; |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1263 if (*format == '#') { |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1264 FETCH_SIZE; |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1265 STORE_SIZE(count); |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1266 format++; |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1267 } |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1268 } |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1269 break; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1270 } |
|
5410
3b2fda31bf1b
Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents:
5408
diff
changeset
|
1271 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1272 case 't': { /* 8-bit character buffer, read-only access */ |
|
36675
dba6494735d0
Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36625
diff
changeset
|
1273 char **p = va_arg(*p_va, char **); |
|
20371
8ef3e95182c3
Undo part of 2.59: 't' case of convertsimple() should not use convertbuffer().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20357
diff
changeset
|
1274 PyBufferProcs *pb = arg->ob_type->tp_as_buffer; |
|
44072
2f47b228ba06
Issue #1521: on 64bit platforms, str.decode fails on very long strings.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
39995
diff
changeset
|
1275 Py_ssize_t count; |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1276 |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1277 if (*format++ != '#') |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1278 return converterr( |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1279 "invalid use of 't' format character", |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
1280 arg, msgbuf, bufsize); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1281 if (!PyType_HasFeature(arg->ob_type, |
|
20371
8ef3e95182c3
Undo part of 2.59: 't' case of convertsimple() should not use convertbuffer().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20357
diff
changeset
|
1282 Py_TPFLAGS_HAVE_GETCHARBUFFER) || |
|
8ef3e95182c3
Undo part of 2.59: 't' case of convertsimple() should not use convertbuffer().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20357
diff
changeset
|
1283 pb == NULL || pb->bf_getcharbuffer == NULL || |
|
8ef3e95182c3
Undo part of 2.59: 't' case of convertsimple() should not use convertbuffer().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20357
diff
changeset
|
1284 pb->bf_getsegcount == NULL) |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1285 return converterr( |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1286 "string or read-only character buffer", |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
1287 arg, msgbuf, bufsize); |
|
9306
79439e4e9976
Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents:
9044
diff
changeset
|
1288 |
|
20371
8ef3e95182c3
Undo part of 2.59: 't' case of convertsimple() should not use convertbuffer().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20357
diff
changeset
|
1289 if (pb->bf_getsegcount(arg, NULL) != 1) |
|
8ef3e95182c3
Undo part of 2.59: 't' case of convertsimple() should not use convertbuffer().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20357
diff
changeset
|
1290 return converterr( |
|
8ef3e95182c3
Undo part of 2.59: 't' case of convertsimple() should not use convertbuffer().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20357
diff
changeset
|
1291 "string or single-segment read-only buffer", |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
1292 arg, msgbuf, bufsize); |
|
20371
8ef3e95182c3
Undo part of 2.59: 't' case of convertsimple() should not use convertbuffer().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20357
diff
changeset
|
1293 |
|
48221
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1294 if (pb->bf_releasebuffer) |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1295 return converterr( |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1296 "string or pinned buffer", |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1297 arg, msgbuf, bufsize); |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1298 |
|
20371
8ef3e95182c3
Undo part of 2.59: 't' case of convertsimple() should not use convertbuffer().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20357
diff
changeset
|
1299 count = pb->bf_getcharbuffer(arg, 0, p); |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1300 if (count < 0) |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
1301 return converterr("(unspecified)", arg, msgbuf, bufsize); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1302 { |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1303 FETCH_SIZE; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1304 STORE_SIZE(count); |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1305 } |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1306 break; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1307 } |
|
9306
79439e4e9976
Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents:
9044
diff
changeset
|
1308 |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1309 default: |
|
21096
cdb70bf88db1
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21092
diff
changeset
|
1310 return converterr("impossible<bad format char>", arg, msgbuf, bufsize); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1311 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1312 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1313 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1314 *p_format = format; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1315 return NULL; |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1316 } |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1317 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1318 static Py_ssize_t |
|
20629
acc7e3b4d042
Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents:
20371
diff
changeset
|
1319 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
|
1320 { |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1321 PyBufferProcs *pb = arg->ob_type->tp_as_buffer; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1322 Py_ssize_t count; |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1323 if (pb == NULL || |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1324 pb->bf_getreadbuffer == NULL || |
|
48221
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1325 pb->bf_getsegcount == NULL || |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1326 pb->bf_releasebuffer != NULL) { |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1327 *errmsg = "string or read-only buffer"; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1328 return -1; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1329 } |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1330 if ((*pb->bf_getsegcount)(arg, NULL) != 1) { |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1331 *errmsg = "string or single-segment read-only buffer"; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1332 return -1; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1333 } |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1334 if ((count = (*pb->bf_getreadbuffer)(arg, 0, p)) < 0) { |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1335 *errmsg = "(unspecified)"; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1336 } |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1337 return count; |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1338 } |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1339 |
|
48221
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1340 static int |
| 48847 | 1341 getbuffer(PyObject *arg, Py_buffer *view, char **errmsg) |
|
48221
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1342 { |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1343 void *buf; |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1344 Py_ssize_t count; |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1345 PyBufferProcs *pb = arg->ob_type->tp_as_buffer; |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1346 if (pb == NULL) { |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1347 *errmsg = "string or buffer"; |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1348 return -1; |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1349 } |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1350 if (pb->bf_getbuffer) { |
| 48847 | 1351 if (pb->bf_getbuffer(arg, view, 0) < 0) { |
| 1352 *errmsg = "convertible to a buffer"; | |
|
48221
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1353 return -1; |
| 48847 | 1354 } |
|
48221
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1355 if (!PyBuffer_IsContiguous(view, 'C')) { |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1356 *errmsg = "contiguous buffer"; |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1357 return -1; |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1358 } |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1359 return 0; |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1360 } |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1361 |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1362 count = convertbuffer(arg, &buf, errmsg); |
| 48847 | 1363 if (count < 0) { |
| 1364 *errmsg = "convertible to a buffer"; | |
|
48221
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1365 return count; |
| 48847 | 1366 } |
|
48221
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1367 PyBuffer_FillInfo(view, NULL, buf, count, 1, 0); |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1368 return 0; |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1369 } |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1370 |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1371 /* 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
|
1372 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
|
1373 |
|
20711
2890769b1e69
PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents:
20710
diff
changeset
|
1374 /* 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
|
1375 int |
|
acc7e3b4d042
Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents:
20371
diff
changeset
|
1376 PyArg_ParseTupleAndKeywords(PyObject *args, |
|
acc7e3b4d042
Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents:
20371
diff
changeset
|
1377 PyObject *keywords, |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
1378 const char *format, |
|
36675
dba6494735d0
Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36625
diff
changeset
|
1379 char **kwlist, ...) |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1380 { |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1381 int retval; |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1382 va_list va; |
|
20710
a44cc0c21cfe
PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents:
20709
diff
changeset
|
1383 |
|
a44cc0c21cfe
PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents:
20709
diff
changeset
|
1384 if ((args == NULL || !PyTuple_Check(args)) || |
|
a44cc0c21cfe
PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents:
20709
diff
changeset
|
1385 (keywords != NULL && !PyDict_Check(keywords)) || |
|
a44cc0c21cfe
PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents:
20709
diff
changeset
|
1386 format == NULL || |
|
a44cc0c21cfe
PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents:
20709
diff
changeset
|
1387 kwlist == NULL) |
|
a44cc0c21cfe
PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents:
20709
diff
changeset
|
1388 { |
|
a44cc0c21cfe
PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents:
20709
diff
changeset
|
1389 PyErr_BadInternalCall(); |
|
20711
2890769b1e69
PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents:
20710
diff
changeset
|
1390 return 0; |
|
20710
a44cc0c21cfe
PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents:
20709
diff
changeset
|
1391 } |
|
a44cc0c21cfe
PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents:
20709
diff
changeset
|
1392 |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1393 va_start(va, kwlist); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1394 retval = vgetargskeywords(args, keywords, format, kwlist, &va, 0); |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1395 va_end(va); |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1396 return retval; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1397 } |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1398 |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1399 int |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1400 _PyArg_ParseTupleAndKeywords_SizeT(PyObject *args, |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1401 PyObject *keywords, |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1402 const char *format, |
|
36675
dba6494735d0
Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36625
diff
changeset
|
1403 char **kwlist, ...) |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1404 { |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1405 int retval; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1406 va_list va; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1407 |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1408 if ((args == NULL || !PyTuple_Check(args)) || |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1409 (keywords != NULL && !PyDict_Check(keywords)) || |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1410 format == NULL || |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1411 kwlist == NULL) |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1412 { |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1413 PyErr_BadInternalCall(); |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1414 return 0; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1415 } |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1416 |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1417 va_start(va, kwlist); |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1418 retval = vgetargskeywords(args, keywords, format, |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1419 kwlist, &va, FLAG_SIZE_T); |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1420 va_end(va); |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1421 return retval; |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1422 } |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1423 |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1424 |
|
32606
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1425 int |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1426 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
|
1427 PyObject *keywords, |
|
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
1428 const char *format, |
|
36675
dba6494735d0
Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36625
diff
changeset
|
1429 char **kwlist, va_list va) |
|
32606
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1430 { |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1431 int retval; |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1432 va_list lva; |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1433 |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1434 if ((args == NULL || !PyTuple_Check(args)) || |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1435 (keywords != NULL && !PyDict_Check(keywords)) || |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1436 format == NULL || |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1437 kwlist == NULL) |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1438 { |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1439 PyErr_BadInternalCall(); |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1440 return 0; |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1441 } |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1442 |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1443 #ifdef VA_LIST_IS_ARRAY |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1444 memcpy(lva, va, sizeof(va_list)); |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1445 #else |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1446 #ifdef __va_copy |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1447 __va_copy(lva, va); |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1448 #else |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1449 lva = va; |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1450 #endif |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1451 #endif |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1452 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1453 retval = vgetargskeywords(args, keywords, format, kwlist, &lva, 0); |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1454 return retval; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1455 } |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1456 |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1457 int |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1458 _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *args, |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1459 PyObject *keywords, |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1460 const char *format, |
|
36675
dba6494735d0
Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36625
diff
changeset
|
1461 char **kwlist, va_list va) |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1462 { |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1463 int retval; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1464 va_list lva; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1465 |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1466 if ((args == NULL || !PyTuple_Check(args)) || |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1467 (keywords != NULL && !PyDict_Check(keywords)) || |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1468 format == NULL || |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1469 kwlist == NULL) |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1470 { |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1471 PyErr_BadInternalCall(); |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1472 return 0; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1473 } |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1474 |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1475 #ifdef VA_LIST_IS_ARRAY |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1476 memcpy(lva, va, sizeof(va_list)); |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1477 #else |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1478 #ifdef __va_copy |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1479 __va_copy(lva, va); |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1480 #else |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1481 lva = va; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1482 #endif |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1483 #endif |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1484 |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1485 retval = vgetargskeywords(args, keywords, format, |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1486 kwlist, &lva, FLAG_SIZE_T); |
|
32606
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1487 return retval; |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1488 } |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1489 |
|
45537
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1490 #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
|
1491 |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1492 static int |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
1493 vgetargskeywords(PyObject *args, PyObject *keywords, const char *format, |
|
36675
dba6494735d0
Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36625
diff
changeset
|
1494 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
|
1495 { |
|
20721
acb854b897bb
vgetargskeywords: Prevent another potential sprintf buffer overrun.
Tim Peters <tim.peters@gmail.com>
parents:
20720
diff
changeset
|
1496 char msgbuf[512]; |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1497 int levels[32]; |
|
45537
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1498 const char *fname, *msg, *custom_msg, *keyword; |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1499 int min = INT_MAX; |
|
20722
676f106a5002
vgetargskeywords: Now that it's clear that nkwlist must equal max, and
Tim Peters <tim.peters@gmail.com>
parents:
20721
diff
changeset
|
1500 int i, len, nargs, nkeywords; |
|
45537
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1501 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
|
1502 |
|
20710
a44cc0c21cfe
PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents:
20709
diff
changeset
|
1503 assert(args != NULL && PyTuple_Check(args)); |
|
a44cc0c21cfe
PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents:
20709
diff
changeset
|
1504 assert(keywords == NULL || PyDict_Check(keywords)); |
|
a44cc0c21cfe
PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents:
20709
diff
changeset
|
1505 assert(format != NULL); |
|
a44cc0c21cfe
PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents:
20709
diff
changeset
|
1506 assert(kwlist != NULL); |
|
a44cc0c21cfe
PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents:
20709
diff
changeset
|
1507 assert(p_va != NULL); |
|
a44cc0c21cfe
PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents:
20709
diff
changeset
|
1508 |
|
45537
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1509 /* grab the function name or custom error msg first (mutually exclusive) */ |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1510 fname = strchr(format, ':'); |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1511 if (fname) { |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1512 fname++; |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1513 custom_msg = NULL; |
|
20720
aaefc2f21bae
vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents:
20718
diff
changeset
|
1514 } |
|
45537
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1515 else { |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1516 custom_msg = strchr(format,';'); |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1517 if (custom_msg) |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1518 custom_msg++; |
|
20720
aaefc2f21bae
vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents:
20718
diff
changeset
|
1519 } |
|
45537
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1520 |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1521 /* scan kwlist and get greatest possible nbr of args */ |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1522 for (len=0; kwlist[len]; len++) |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1523 continue; |
|
20711
2890769b1e69
PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents:
20710
diff
changeset
|
1524 |
| 20713 | 1525 nargs = PyTuple_GET_SIZE(args); |
|
45537
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1526 nkeywords = (keywords == NULL) ? 0 : PyDict_Size(keywords); |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1527 if (nargs + nkeywords > len) { |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1528 PyErr_Format(PyExc_TypeError, "%s%s takes at most %d " |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1529 "argument%s (%d given)", |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1530 (fname == NULL) ? "function" : fname, |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1531 (fname == NULL) ? "" : "()", |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1532 len, |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1533 (len == 1) ? "" : "s", |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1534 nargs + nkeywords); |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1535 return 0; |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1536 } |
| 20723 | 1537 |
|
45537
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1538 /* convert tuple args and keyword args in same loop, using kwlist to drive process */ |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1539 for (i = 0; i < len; i++) { |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1540 keyword = kwlist[i]; |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1541 if (*format == '|') { |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1542 min = i; |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1543 format++; |
|
45537
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1544 } |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1545 if (IS_END_OF_FORMAT(*format)) { |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1546 PyErr_Format(PyExc_RuntimeError, |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1547 "More keyword list entries (%d) than " |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1548 "format specifiers (%d)", len, i); |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1549 return cleanreturn(0, freelist); |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1550 } |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1551 current_arg = NULL; |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1552 if (nkeywords) { |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1553 current_arg = PyDict_GetItemString(keywords, keyword); |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1554 } |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1555 if (current_arg) { |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1556 --nkeywords; |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1557 if (i < nargs) { |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1558 /* arg present in tuple and in dict */ |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1559 PyErr_Format(PyExc_TypeError, |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1560 "Argument given by name ('%s') " |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1561 "and position (%d)", |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1562 keyword, i+1); |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1563 return cleanreturn(0, freelist); |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1564 } |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1565 } |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1566 else if (nkeywords && PyErr_Occurred()) |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1567 return cleanreturn(0, freelist); |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1568 else if (i < nargs) |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1569 current_arg = PyTuple_GET_ITEM(args, i); |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1570 |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1571 if (current_arg) { |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1572 msg = convertitem(current_arg, &format, p_va, flags, |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1573 levels, msgbuf, sizeof(msgbuf), &freelist); |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1574 if (msg) { |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1575 seterror(i+1, msg, levels, fname, custom_msg); |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1576 return cleanreturn(0, freelist); |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1577 } |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1578 continue; |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1579 } |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1580 |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1581 if (i < min) { |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1582 PyErr_Format(PyExc_TypeError, "Required argument " |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1583 "'%s' (pos %d) not found", |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1584 keyword, i+1); |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1585 return cleanreturn(0, freelist); |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1586 } |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1587 /* current code reports success when all required args |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1588 * fulfilled and no keyword args left, with no further |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1589 * validation. XXX Maybe skip this in debug build ? |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1590 */ |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1591 if (!nkeywords) |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1592 return cleanreturn(1, freelist); |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1593 |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1594 /* We are into optional args, skip thru to any remaining |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1595 * keyword args */ |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1596 msg = skipitem(&format, p_va, flags); |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1597 if (msg) { |
|
45537
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1598 PyErr_Format(PyExc_RuntimeError, "%s: '%s'", msg, |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1599 format); |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
1600 return cleanreturn(0, freelist); |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1601 } |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1602 } |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1603 |
|
50305
e673632e1885
Merged revisions 67898,67904-67907,67912,67918,67920-67921,67923-67924,67927,67930,67932,67943 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48889
diff
changeset
|
1604 if (!IS_END_OF_FORMAT(*format) && *format != '|') { |
|
45537
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1605 PyErr_Format(PyExc_RuntimeError, |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1606 "more argument specifiers than keyword list entries " |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1607 "(remaining format:'%s')", format); |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1608 return cleanreturn(0, freelist); |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1609 } |
| 20715 | 1610 |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1611 /* make sure there are no extraneous keyword arguments */ |
| 20723 | 1612 if (nkeywords > 0) { |
| 1613 PyObject *key, *value; | |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1614 Py_ssize_t pos = 0; |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1615 while (PyDict_Next(keywords, &pos, &key, &value)) { |
| 20723 | 1616 int match = 0; |
|
22801
f0277146aa16
Fix by Greg Chapman from SF bug 534347: Potential AV in vgetargskeywords.
Guido van Rossum <guido@python.org>
parents:
21667
diff
changeset
|
1617 char *ks; |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1618 if (!PyString_Check(key)) { |
|
22801
f0277146aa16
Fix by Greg Chapman from SF bug 534347: Potential AV in vgetargskeywords.
Guido van Rossum <guido@python.org>
parents:
21667
diff
changeset
|
1619 PyErr_SetString(PyExc_TypeError, |
|
f0277146aa16
Fix by Greg Chapman from SF bug 534347: Potential AV in vgetargskeywords.
Guido van Rossum <guido@python.org>
parents:
21667
diff
changeset
|
1620 "keywords must be strings"); |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
1621 return cleanreturn(0, freelist); |
|
22801
f0277146aa16
Fix by Greg Chapman from SF bug 534347: Potential AV in vgetargskeywords.
Guido van Rossum <guido@python.org>
parents:
21667
diff
changeset
|
1622 } |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1623 ks = PyString_AsString(key); |
|
45537
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1624 for (i = 0; i < len; i++) { |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1625 if (!strcmp(ks, kwlist[i])) { |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1626 match = 1; |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1627 break; |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1628 } |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1629 } |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1630 if (!match) { |
| 20723 | 1631 PyErr_Format(PyExc_TypeError, |
| 1632 "'%s' is an invalid keyword " | |
| 1633 "argument for this function", | |
| 1634 ks); | |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
1635 return cleanreturn(0, freelist); |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1636 } |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1637 } |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1638 } |
| 20723 | 1639 |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
1640 return cleanreturn(1, freelist); |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1641 } |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1642 |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1643 |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1644 static char * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1645 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
|
1646 { |
|
45537
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1647 const char *format = *p_format; |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1648 char c = *format++; |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1649 |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1650 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
|
1651 |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1652 /* simple codes |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1653 * The individual types (second arg of va_arg) are irrelevant */ |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1654 |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1655 case 'b': /* byte -- very short int */ |
|
13872
35fc9511a36f
Changed H specifier to mean "bitfield", i.e. any value from
Jack Jansen <jack.jansen@cwi.nl>
parents:
13837
diff
changeset
|
1656 case 'B': /* byte as bitfield */ |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1657 case 'h': /* short int */ |
|
13872
35fc9511a36f
Changed H specifier to mean "bitfield", i.e. any value from
Jack Jansen <jack.jansen@cwi.nl>
parents:
13837
diff
changeset
|
1658 case 'H': /* short int as bitfield */ |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1659 case 'i': /* int */ |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1660 case 'I': /* int sized bitfield */ |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1661 case 'l': /* long int */ |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1662 case 'k': /* long int sized bitfield */ |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1663 #ifdef HAVE_LONG_LONG |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1664 case 'L': /* PY_LONG_LONG */ |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1665 case 'K': /* PY_LONG_LONG sized bitfield */ |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1666 #endif |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1667 case 'f': /* float */ |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1668 case 'd': /* double */ |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1669 #ifndef WITHOUT_COMPLEX |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1670 case 'D': /* complex double */ |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1671 #endif |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1672 case 'c': /* char */ |
|
13378
113d833eea7e
Added support for H (unsigned short) specifier in PyArg_ParseTuple and
Jack Jansen <jack.jansen@cwi.nl>
parents:
13268
diff
changeset
|
1673 { |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1674 (void) va_arg(*p_va, void *); |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1675 break; |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1676 } |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1677 |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1678 case 'n': /* Py_ssize_t */ |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1679 { |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1680 (void) va_arg(*p_va, Py_ssize_t *); |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1681 break; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1682 } |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1683 |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1684 /* string codes */ |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1685 |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1686 case 'e': /* string with encoding */ |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1687 { |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1688 (void) va_arg(*p_va, const char *); |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1689 if (!(*format == 's' || *format == 't')) |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1690 /* after 'e', only 's' and 't' is allowed */ |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1691 goto err; |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1692 format++; |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1693 /* explicit fallthrough to string cases */ |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1694 } |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1695 |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1696 case 's': /* string */ |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1697 case 'z': /* string or None */ |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1698 #ifdef Py_USING_UNICODE |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1699 case 'u': /* unicode string */ |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1700 #endif |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1701 case 't': /* buffer, read-only */ |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1702 case 'w': /* buffer, read-write */ |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1703 { |
| 4596 | 1704 (void) va_arg(*p_va, char **); |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1705 if (*format == '#') { |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1706 if (flags & FLAG_SIZE_T) |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1707 (void) va_arg(*p_va, Py_ssize_t *); |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1708 else |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1709 (void) va_arg(*p_va, int *); |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1710 format++; |
|
48221
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1711 } else if ((c == 's' || c == 'z') && *format == '*') { |
|
b8c4bf393794
Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents:
47527
diff
changeset
|
1712 format++; |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1713 } |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1714 break; |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1715 } |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1716 |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1717 /* object codes */ |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1718 |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1719 case 'S': /* string object */ |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1720 #ifdef Py_USING_UNICODE |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1721 case 'U': /* unicode string object */ |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1722 #endif |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1723 { |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
1724 (void) va_arg(*p_va, PyObject **); |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1725 break; |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1726 } |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1727 |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1728 case 'O': /* object */ |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1729 { |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1730 if (*format == '!') { |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1731 format++; |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
1732 (void) va_arg(*p_va, PyTypeObject*); |
|
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
1733 (void) va_arg(*p_va, PyObject **); |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1734 } |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1735 #if 0 |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1736 /* I don't know what this is for */ |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1737 else if (*format == '?') { |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1738 inquiry pred = va_arg(*p_va, inquiry); |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1739 format++; |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1740 if ((*pred)(arg)) { |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
1741 (void) va_arg(*p_va, PyObject **); |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1742 } |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1743 } |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1744 #endif |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1745 else if (*format == '&') { |
|
13447
a89f7f268de4
Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents:
13378
diff
changeset
|
1746 typedef int (*converter)(PyObject *, void *); |
| 4596 | 1747 (void) va_arg(*p_va, converter); |
| 1748 (void) va_arg(*p_va, void *); | |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1749 format++; |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1750 } |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1751 else { |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
1752 (void) va_arg(*p_va, PyObject **); |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1753 } |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1754 break; |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1755 } |
|
45537
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1756 |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1757 case '(': /* bypass tuple, not handled at all previously */ |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1758 { |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1759 char *msg; |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1760 for (;;) { |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1761 if (*format==')') |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1762 break; |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1763 if (IS_END_OF_FORMAT(*format)) |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1764 return "Unmatched left paren in format " |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1765 "string"; |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1766 msg = skipitem(&format, p_va, flags); |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1767 if (msg) |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1768 return msg; |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1769 } |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1770 format++; |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1771 break; |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1772 } |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1773 |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1774 case ')': |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1775 return "Unmatched right paren in format string"; |
|
f33f66a2082f
Patch #1691070 from Roger Upole: Speed up PyArg_ParseTupleAndKeywords() and improve error msg
Christian Heimes <christian@cheimes.de>
parents:
45530
diff
changeset
|
1776 |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1777 default: |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1778 err: |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1779 return "impossible<bad format char>"; |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1780 |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1781 } |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1782 |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1783 *p_format = format; |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1784 return NULL; |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1785 } |
|
20632
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1786 |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1787 |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1788 int |
|
36750
92ba72484ff3
Use Py_ssize_t for PyArg_UnpackTuple arguments.
Martin v. Löwis <martin@v.loewis.de>
parents:
36675
diff
changeset
|
1789 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
|
1790 { |
|
36750
92ba72484ff3
Use Py_ssize_t for PyArg_UnpackTuple arguments.
Martin v. Löwis <martin@v.loewis.de>
parents:
36675
diff
changeset
|
1791 Py_ssize_t i, l; |
|
20632
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1792 PyObject **o; |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1793 va_list vargs; |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1794 |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1795 #ifdef HAVE_STDARG_PROTOTYPES |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1796 va_start(vargs, max); |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1797 #else |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1798 va_start(vargs); |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1799 #endif |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1800 |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1801 assert(min >= 0); |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1802 assert(min <= max); |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1803 if (!PyTuple_Check(args)) { |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1804 PyErr_SetString(PyExc_SystemError, |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1805 "PyArg_UnpackTuple() argument list is not a tuple"); |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1806 return 0; |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1807 } |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1808 l = PyTuple_GET_SIZE(args); |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1809 if (l < min) { |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1810 if (name != NULL) |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1811 PyErr_Format( |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1812 PyExc_TypeError, |
|
36758
3e19271efc46
Use %zd format characters for Py_ssize_t types.
Thomas Wouters <thomas@python.org>
parents:
36750
diff
changeset
|
1813 "%s expected %s%zd arguments, got %zd", |
|
20632
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1814 name, (min == max ? "" : "at least "), min, l); |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1815 else |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1816 PyErr_Format( |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1817 PyExc_TypeError, |
|
36758
3e19271efc46
Use %zd format characters for Py_ssize_t types.
Thomas Wouters <thomas@python.org>
parents:
36750
diff
changeset
|
1818 "unpacked tuple should have %s%zd elements," |
|
3e19271efc46
Use %zd format characters for Py_ssize_t types.
Thomas Wouters <thomas@python.org>
parents:
36750
diff
changeset
|
1819 " but has %zd", |
|
20632
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1820 (min == max ? "" : "at least "), min, l); |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1821 va_end(vargs); |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1822 return 0; |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1823 } |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1824 if (l > max) { |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1825 if (name != NULL) |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1826 PyErr_Format( |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1827 PyExc_TypeError, |
|
36758
3e19271efc46
Use %zd format characters for Py_ssize_t types.
Thomas Wouters <thomas@python.org>
parents:
36750
diff
changeset
|
1828 "%s expected %s%zd arguments, got %zd", |
|
20632
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1829 name, (min == max ? "" : "at most "), max, l); |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1830 else |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1831 PyErr_Format( |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1832 PyExc_TypeError, |
|
36758
3e19271efc46
Use %zd format characters for Py_ssize_t types.
Thomas Wouters <thomas@python.org>
parents:
36750
diff
changeset
|
1833 "unpacked tuple should have %s%zd elements," |
|
3e19271efc46
Use %zd format characters for Py_ssize_t types.
Thomas Wouters <thomas@python.org>
parents:
36750
diff
changeset
|
1834 " but has %zd", |
|
20632
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1835 (min == max ? "" : "at most "), max, l); |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1836 va_end(vargs); |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1837 return 0; |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1838 } |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1839 for (i = 0; i < l; i++) { |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1840 o = va_arg(vargs, PyObject **); |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1841 *o = PyTuple_GET_ITEM(args, i); |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1842 } |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1843 va_end(vargs); |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1844 return 1; |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1845 } |
|
35449
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1846 |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1847 |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1848 /* 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
|
1849 * |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1850 * Sets a TypeError and returns 0 if the kwds dict is |
| 39865 | 1851 * 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
|
1852 */ |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1853 int |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
1854 _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
|
1855 { |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1856 if (kw == NULL) |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1857 return 1; |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1858 if (!PyDict_CheckExact(kw)) { |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1859 PyErr_BadInternalCall(); |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1860 return 0; |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1861 } |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1862 if (PyDict_Size(kw) == 0) |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1863 return 1; |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1864 |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1865 PyErr_Format(PyExc_TypeError, "%s does not take keyword arguments", |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1866 funcname); |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1867 return 0; |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1868 } |
|
37619
f19addd69ad9
avoid C++ name mangling for the _Py.*SizeT functions
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36773
diff
changeset
|
1869 #ifdef __cplusplus |
|
f19addd69ad9
avoid C++ name mangling for the _Py.*SizeT functions
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36773
diff
changeset
|
1870 }; |
|
f19addd69ad9
avoid C++ name mangling for the _Py.*SizeT functions
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36773
diff
changeset
|
1871 #endif |
