annotate Python/getargs.c @ 37468:04afb3650847 legacy-trunk

Generate line number table entries for except handlers. Re-enable all the tests in test_trace.py except one. Still not sure that these tests test what they used to test, but they pass. One failing test seems to be caused by undocumented line number table behavior in Python 2.4.
author Jeremy Hylton <jeremy@alum.mit.edu>
date Tue, 04 Apr 2006 14:26:39 +0000
parents 64ff3b225d48
children 49c6eb688906 f19addd69ad9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35552
diff changeset
9 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
10 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
11 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
12
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13378
diff changeset
13 int PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
36675
dba6494735d0 Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents: 36625
diff changeset
14 const char *, char **, ...);
32606
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
15 int PyArg_VaParseTupleAndKeywords(PyObject *, PyObject *,
36675
dba6494735d0 Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents: 36625
diff changeset
16 const char *, char **, va_list);
32606
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
17
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
18 #define FLAG_COMPAT 1
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
19 #define FLAG_SIZE_T 2
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
20
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
21
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 /* Forward */
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35552
diff changeset
23 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
24 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
25 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
26 char *, size_t, PyObject **);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
27 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
28 int *, char *, size_t, int, PyObject **);
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
29 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
30 size_t, PyObject **);
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
31 static Py_ssize_t convertbuffer(PyObject *, void **p, char **);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
32
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13378
diff changeset
33 static int vgetargskeywords(PyObject *, PyObject *,
36675
dba6494735d0 Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents: 36625
diff changeset
34 const char *, char **, va_list *, int);
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
35 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
36
20629
acc7e3b4d042 Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents: 20371
diff changeset
37 int
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35552
diff changeset
38 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
39 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 int retval;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 va_list va;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
42
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 va_start(va, format);
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
44 retval = vgetargs1(args, format, &va, FLAG_COMPAT);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
45 va_end(va);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
46 return retval;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
47 }
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
48
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
49 int
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
50 _PyArg_Parse_SizeT(PyObject *args, char *format, ...)
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
51 {
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
52 int retval;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
53 va_list va;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
54
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
55 va_start(va, format);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
56 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
57 va_end(va);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 return retval;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
60
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
61
20629
acc7e3b4d042 Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents: 20371
diff changeset
62 int
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35552
diff changeset
63 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
64 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 int retval;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 va_list va;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
67
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 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
69 retval = vgetargs1(args, format, &va, 0);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 va_end(va);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 return retval;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
73
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
74 int
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
75 _PyArg_ParseTuple_SizeT(PyObject *args, char *format, ...)
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
76 {
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
77 int retval;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
78 va_list va;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
79
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
80 va_start(va, format);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
81 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
82 va_end(va);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
83 return retval;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
84 }
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
85
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
86
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 int
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35552
diff changeset
88 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
89 {
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
90 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
91
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
92 #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
93 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
94 #else
24400
81ca6ca5c307 Patch #554716: Use __va_copy where available.
Martin v. Löwis <martin@v.loewis.de>
parents: 22801
diff changeset
95 #ifdef __va_copy
81ca6ca5c307 Patch #554716: Use __va_copy where available.
Martin v. Löwis <martin@v.loewis.de>
parents: 22801
diff changeset
96 __va_copy(lva, va);
81ca6ca5c307 Patch #554716: Use __va_copy where available.
Martin v. Löwis <martin@v.loewis.de>
parents: 22801
diff changeset
97 #else
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
98 lva = va;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
99 #endif
24400
81ca6ca5c307 Patch #554716: Use __va_copy where available.
Martin v. Löwis <martin@v.loewis.de>
parents: 22801
diff changeset
100 #endif
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
101
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
102 return vgetargs1(args, format, &lva, 0);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
103 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
104
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
105 int
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
106 _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
107 {
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
108 va_list lva;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
109
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
110 #ifdef VA_LIST_IS_ARRAY
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
111 memcpy(lva, va, sizeof(va_list));
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
112 #else
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
113 #ifdef __va_copy
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
114 __va_copy(lva, va);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
115 #else
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
116 lva = va;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
117 #endif
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
118 #endif
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
119
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
120 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
121 }
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
122
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
123
28952
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
124 /* Handle cleanup of allocated memory in case of exception */
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
125
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
126 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
127 addcleanup(void *ptr, 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
128 {
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
129 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
130 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
131 *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
132 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
133 PyMem_FREE(ptr);
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
134 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
135 }
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
136 }
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
137 cobj = PyCObject_FromVoidPtr(ptr, NULL);
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
138 if (!cobj) {
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
139 PyMem_FREE(ptr);
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
140 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
141 }
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
142 if(PyList_Append(*freelist, cobj)) {
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
143 PyMem_FREE(ptr);
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
144 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
145 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
146 }
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
147 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
148 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
149 }
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
150
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
151 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
152 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
153 {
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
154 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
155 if((retval) == 0) {
36521
30aef3ce2b26 Use Py_ssize_t to count the
Martin v. Löwis <martin@v.loewis.de>
parents: 36501
diff changeset
156 Py_ssize_t len = PyList_GET_SIZE(freelist), i;
28952
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
157 for (i = 0; i < len; i++)
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
158 PyMem_FREE(PyCObject_AsVoidPtr(
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
159 PyList_GET_ITEM(freelist, i)));
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
160 }
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
161 Py_DECREF(freelist);
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
162 }
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
163 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
164 }
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
165
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
166
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
167 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
168 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
169 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
170 char msgbuf[256];
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
171 int levels[32];
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35552
diff changeset
172 const char *fname = NULL;
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35552
diff changeset
173 const char *message = NULL;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
174 int min = -1;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
175 int max = 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
176 int level = 0;
17997
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
177 int endfmt = 0;
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35552
diff changeset
178 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
179 Py_ssize_t i, len;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
180 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
181 PyObject *freelist = NULL;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
182 int compat = flags & FLAG_COMPAT;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
183
16582
9a8e961b505f Related to SF bug 132008 (PyList_Reverse blows up).
Tim Peters <tim.peters@gmail.com>
parents: 16264
diff changeset
184 assert(compat || (args != (PyObject*)NULL));
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
185 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
186
17997
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
187 while (endfmt == 0) {
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
188 int c = *format++;
17997
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
189 switch (c) {
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
190 case '(':
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
191 if (level == 0)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
192 max++;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
193 level++;
17997
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
194 break;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
195 case ')':
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
196 if (level == 0)
17997
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
197 Py_FatalError("excess ')' in getargs format");
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
198 else
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
199 level--;
17997
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
200 break;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
201 case '\0':
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
202 endfmt = 1;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
203 break;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
204 case ':':
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
205 fname = format;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
206 endfmt = 1;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
207 break;
17997
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
208 case ';':
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
209 message = format;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
210 endfmt = 1;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
211 break;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
212 default:
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
213 if (level == 0) {
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
214 if (c == 'O')
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
215 max++;
36090
8cb686dd6e64 Fix SF bug #1072182, problems with signed characters.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35999
diff changeset
216 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
217 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
218 max++;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
219 } else if (c == '|')
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
220 min = max;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
221 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
222 break;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
224 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
225
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
226 if (level != 0)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
227 Py_FatalError(/* '(' */ "missing ')' in getargs format");
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
228
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
229 if (min < 0)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
230 min = max;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
231
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
232 format = formatsave;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
233
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
234 if (compat) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
235 if (max == 0) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
236 if (args == NULL)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
237 return 1;
21074
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
238 PyOS_snprintf(msgbuf, sizeof(msgbuf),
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
239 "%.200s%s takes no arguments",
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
240 fname==NULL ? "function" : fname,
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
241 fname==NULL ? "" : "()");
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
242 PyErr_SetString(PyExc_TypeError, msgbuf);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
243 return 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
244 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
245 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
246 if (args == NULL) {
21074
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
247 PyOS_snprintf(msgbuf, sizeof(msgbuf),
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
248 "%.200s%s takes at least one argument",
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
249 fname==NULL ? "function" : fname,
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
250 fname==NULL ? "" : "()");
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
251 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
252 return 0;
7f8719a36662 prevent core dump for old getargs() with NULL arg
Guido van Rossum <guido@python.org>
parents: 1913
diff changeset
253 }
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
254 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
255 msgbuf, sizeof(msgbuf), &freelist);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
256 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
257 return cleanreturn(1, freelist);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
258 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
259 return cleanreturn(0, freelist);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
260 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
261 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
262 PyErr_SetString(PyExc_SystemError,
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
263 "old style getargs format uses new features");
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
264 return 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
265 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
266 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
267
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
268 if (!PyTuple_Check(args)) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
269 PyErr_SetString(PyExc_SystemError,
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
270 "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
271 return 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
272 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
273
17856
2807949e0ba5 vgetargs1() and vgetargskeywords(): Replace uses of PyTuple_Size() and
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17817
diff changeset
274 len = PyTuple_GET_SIZE(args);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
275
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
276 if (len < min || max < len) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
277 if (message == NULL) {
21074
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
278 PyOS_snprintf(msgbuf, sizeof(msgbuf),
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
279 "%.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
280 "(%ld given)",
21074
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
281 fname==NULL ? "function" : fname,
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
282 fname==NULL ? "" : "()",
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
283 min==max ? "exactly"
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
284 : len < min ? "at least" : "at most",
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
285 len < min ? min : max,
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
286 (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
287 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
288 message = msgbuf;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
289 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
290 PyErr_SetString(PyExc_TypeError, message);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
291 return 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
292 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
293
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
294 for (i = 0; i < len; i++) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
295 if (*format == '|')
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
296 format++;
17856
2807949e0ba5 vgetargs1() and vgetargskeywords(): Replace uses of PyTuple_Size() and
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17817
diff changeset
297 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
298 flags, levels, msgbuf,
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
299 sizeof(msgbuf), &freelist);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
300 if (msg) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
301 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
302 return cleanreturn(0, freelist);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
303 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
304 }
6805
93e480dedcf0 Add explicit check for correct next character in format at end of
Guido van Rossum <guido@python.org>
parents: 5410
diff changeset
305
36093
b8b3782b2dc0 Remove extra parens
Neal Norwitz <nnorwitz@gmail.com>
parents: 36090
diff changeset
306 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
307 *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
308 *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
309 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
310 "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
311 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
312 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
313
28952
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
314 return cleanreturn(1, freelist);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
315 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
316
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
317
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
318
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
319 static void
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35552
diff changeset
320 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
321 const char *message)
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
322 {
21066
225c7dd17e37 Fixes for possible buffer overflows in sprintf() usages.
Marc-André Lemburg <mal@egenix.com>
parents: 20723
diff changeset
323 char buf[512];
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
324 int i;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
325 char *p = buf;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
326
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
327 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
328 return;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
329 else if (message == NULL) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
330 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
331 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
332 p += strlen(p);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
333 }
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
334 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
335 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
336 "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
337 i = 0;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
338 p += strlen(p);
21066
225c7dd17e37 Fixes for possible buffer overflows in sprintf() usages.
Marc-André Lemburg <mal@egenix.com>
parents: 20723
diff changeset
339 while (levels[i] > 0 && (int)(p-buf) < 220) {
21092
53270d281bf0 Use PyOS_snprintf() at some cost even though it was correct before.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21074
diff changeset
340 PyOS_snprintf(p, sizeof(buf) - (buf - p),
53270d281bf0 Use PyOS_snprintf() at some cost even though it was correct before.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21074
diff changeset
341 ", 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
342 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
343 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
344 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
345 }
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
346 else {
21145
87fa6e9bd77e mysnprintf.c: Massive rewrite of PyOS_snprintf and PyOS_vsnprintf, to
Tim Peters <tim.peters@gmail.com>
parents: 21100
diff changeset
347 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
348 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
349 }
21145
87fa6e9bd77e mysnprintf.c: Massive rewrite of PyOS_snprintf and PyOS_vsnprintf, to
Tim Peters <tim.peters@gmail.com>
parents: 21100
diff changeset
350 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
351 message = buf;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
352 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
353 PyErr_SetString(PyExc_TypeError, message);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
354 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
355
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
356
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
357 /* Convert a tuple argument.
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
358 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
359 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
360 If successful:
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
361 *p_format and *p_va are updated,
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
362 *levels and *msgbuf are untouched,
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
363 and NULL is returned.
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
364 If the argument is invalid:
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
365 *p_format is unchanged,
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
366 *p_va is undefined,
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
367 *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
368 *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
369 "must be <typename1>, not <typename2>", where:
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
370 <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
371 <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
372 and msgbuf is returned.
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
373 */
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
374
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
375 static char *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
376 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
377 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
378 PyObject **freelist)
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
379 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
380 int level = 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
381 int n = 0;
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35552
diff changeset
382 const char *format = *p_format;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
383 int i;
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 for (;;) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
386 int c = *format++;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
387 if (c == '(') {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
388 if (level == 0)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
389 n++;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
390 level++;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
391 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
392 else if (c == ')') {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
393 if (level == 0)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
394 break;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
395 level--;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
396 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
397 else if (c == ':' || c == ';' || c == '\0')
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
398 break;
36090
8cb686dd6e64 Fix SF bug #1072182, problems with signed characters.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35999
diff changeset
399 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
400 n++;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
401 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
402
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
403 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
404 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
405 PyOS_snprintf(msgbuf, bufsize,
21074
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
406 toplevel ? "expected %d arguments, not %.50s" :
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
407 "must be %d-item sequence, not %.50s",
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
408 n,
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
409 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
410 return msgbuf;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
411 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
412
13576
61e4c29d53d8 replace PyXXX_Length calls with PyXXX_Size calls
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 13447
diff changeset
413 if ((i = PySequence_Size(arg)) != n) {
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
414 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
415 PyOS_snprintf(msgbuf, bufsize,
21074
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
416 toplevel ? "expected %d arguments, not %d" :
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
417 "must be sequence of length %d, not %d",
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
418 n, i);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
419 return msgbuf;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
420 }
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
421
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
422 format = *p_format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
423 for (i = 0; i < n; i++) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
424 char *msg;
10220
0ef1071cb7fe Patch by Tommy Burnette to accept an arbitrary sequence when "(...)"
Guido van Rossum <guido@python.org>
parents: 9949
diff changeset
425 PyObject *item;
0ef1071cb7fe Patch by Tommy Burnette to accept an arbitrary sequence when "(...)"
Guido van Rossum <guido@python.org>
parents: 9949
diff changeset
426 item = PySequence_GetItem(arg, i);
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
427 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
428 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
429 /* 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
430 Py_XDECREF(item);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
431 if (msg != NULL) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
432 levels[0] = i+1;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
433 return msg;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
434 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
435 }
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
436
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
437 *p_format = format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
438 return NULL;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
439 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
440
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 /* Convert a single item. */
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
443
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
444 static char *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
445 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
446 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
447 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
448 char *msg;
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35552
diff changeset
449 const char *format = *p_format;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
450
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
451 if (*format == '(' /* ')' */) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
452 format++;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
453 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
454 bufsize, 0, freelist);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
455 if (msg == NULL)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
456 format++;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
457 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
458 else {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
459 msg = convertsimple(arg, &format, p_va, flags,
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
460 msgbuf, bufsize, freelist);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
461 if (msg != NULL)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
462 levels[0] = 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
463 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
464 if (msg == NULL)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
465 *p_format = format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
466 return msg;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
467 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
468
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
469
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
470
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
471 #define UNICODE_DEFAULT_ENCODING(arg) \
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
472 _PyUnicode_AsDefaultEncodedString(arg, NULL)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
473
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
474 /* 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
475
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
476 static char *
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35552
diff changeset
477 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
478 {
19820
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
479 assert(expected != NULL);
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
480 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
481 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
482 "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
483 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
484 return msgbuf;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
485 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
486
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
487 #define CONV_UNICODE "(unicode conversion error)"
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
488
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
489 /* 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
490 * 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
491 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
492 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
493 {
9e47f9ed49f6 If a float is passed where a int is expected, issue a DeprecationWarning
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 27363
diff changeset
494 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
495 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
496 "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
497 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
498 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
499 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
500 }
9e47f9ed49f6 If a float is passed where a int is expected, issue a DeprecationWarning
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 27363
diff changeset
501
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
502 /* 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
503 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
504 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
505 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
506 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
507
9b7d117eb4bc Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents: 35449
diff changeset
508 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
509 */
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 static char *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
512 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
513 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
514 {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
515 /* For # codes */
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
516 #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
517 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
518 else q=va_arg(*p_va, int*);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
519 #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
520 #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
521
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35552
diff changeset
522 const char *format = *p_format;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
523 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
524 #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
525 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
526 #endif
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
527
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
528 switch (c) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
529
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
530 case 'b': { /* unsigned byte -- very short int */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
531 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
532 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
533 if (float_argument_error(arg))
33013
Michael W. Hudson <mwh@python.net>
parents: 32606
diff changeset
534 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
535 ival = PyInt_AsLong(arg);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
536 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
537 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
538 else if (ival < 0) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
539 PyErr_SetString(PyExc_OverflowError,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
540 "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
541 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
542 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
543 else if (ival > UCHAR_MAX) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
544 PyErr_SetString(PyExc_OverflowError,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
545 "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
546 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
547 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
548 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
549 *p = (unsigned char) ival;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
550 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
551 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
552
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
553 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
554 values allowed */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
555 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
556 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
557 if (float_argument_error(arg))
33013
Michael W. Hudson <mwh@python.net>
parents: 32606
diff changeset
558 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
559 ival = PyInt_AsUnsignedLongMask(arg);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
560 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
561 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
562 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
563 *p = (unsigned char) ival;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
564 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
565 }
13872
35fc9511a36f Changed H specifier to mean "bitfield", i.e. any value from
Jack Jansen <jack.jansen@cwi.nl>
parents: 13837
diff changeset
566
28667
5bfdbc0fd172 Roll back changes to 'h' format code -- too much breaks. Other
Guido van Rossum <guido@python.org>
parents: 28652
diff changeset
567 case 'h': {/* signed short int */
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
568 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
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
Michael W. Hudson <mwh@python.net>
parents: 32606
diff changeset
571 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
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<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
575 else if (ival < SHRT_MIN) {
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
576 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
577 "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
578 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
579 }
28667
5bfdbc0fd172 Roll back changes to 'h' format code -- too much breaks. Other
Guido van Rossum <guido@python.org>
parents: 28652
diff changeset
580 else if (ival > SHRT_MAX) {
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
581 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
582 "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
583 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
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 = (short) 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 '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
591 unsigned allowed */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
592 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
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
Michael W. Hudson <mwh@python.net>
parents: 32606
diff changeset
595 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
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<H>", 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 short) 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 }
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
603
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
604 case 'i': {/* signed int */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
605 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
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
Michael W. Hudson <mwh@python.net>
parents: 32606
diff changeset
608 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
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<i>", arg, msgbuf, bufsize);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
612 else if (ival > INT_MAX) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
613 PyErr_SetString(PyExc_OverflowError,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
614 "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
615 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
616 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
617 else if (ival < INT_MIN) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
618 PyErr_SetString(PyExc_OverflowError,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
619 "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
620 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
621 }
17996
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 = 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 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
626
28652
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
627 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
628 unsigned allowed */
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
629 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
630 unsigned int ival;
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
631 if (float_argument_error(arg))
33013
Michael W. Hudson <mwh@python.net>
parents: 32606
diff changeset
632 return converterr("integer<I>", 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);
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
634 if (ival == -1 && PyErr_Occurred())
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
635 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
636 else
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
637 *p = ival;
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
638 break;
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
639 }
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
640
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
641 case 'n': /* Py_ssize_t */
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
642 #if SIZEOF_SIZE_T != SIZEOF_LONG
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
643 {
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
644 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
645 Py_ssize_t ival;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
646 if (float_argument_error(arg))
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
647 return converterr("integer<i>", arg, msgbuf, bufsize);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
648 ival = PyInt_AsSsize_t(arg);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
649 if (ival == -1 && PyErr_Occurred())
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
650 return converterr("integer<i>", arg, msgbuf, bufsize);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
651 *p = ival;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
652 break;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
653 }
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
654 #endif
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
655 /* 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
656 case 'l': {/* long int */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
657 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
658 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
659 if (float_argument_error(arg))
33013
Michael W. Hudson <mwh@python.net>
parents: 32606
diff changeset
660 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
661 ival = PyInt_AsLong(arg);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
662 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
663 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
664 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
665 *p = ival;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
666 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
667 }
28652
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
668
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
669 case 'k': { /* long sized bitfield */
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
670 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
671 unsigned long ival;
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
672 if (PyInt_Check(arg))
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
673 ival = PyInt_AsUnsignedLongMask(arg);
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
674 else if (PyLong_Check(arg))
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
675 ival = PyLong_AsUnsignedLongMask(arg);
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
676 else
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
677 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
678 *p = ival;
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
679 break;
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
680 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
681
9949
98e37347378b Change rare occurrences of #if HAVE_LONG_LONG to #ifdef.
Guido van Rossum <guido@python.org>
parents: 9306
diff changeset
682 #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
683 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
684 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
685 PY_LONG_LONG ival = PyLong_AsLongLong( arg );
871da703e4c0 Rename LONG_LONG to PY_LONG_LONG. Fixes #710285.
Martin v. Löwis <martin@v.loewis.de>
parents: 27685
diff changeset
686 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
687 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
688 } else {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
689 *p = ival;
8822
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
690 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
691 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
692 }
28652
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
693
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
694 case 'K': { /* long long sized bitfield */
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
695 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
696 unsigned PY_LONG_LONG ival;
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
697 if (PyInt_Check(arg))
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
698 ival = PyInt_AsUnsignedLongMask(arg);
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
699 else if (PyLong_Check(arg))
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
700 ival = PyLong_AsUnsignedLongLongMask(arg);
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
701 else
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
702 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
703 *p = ival;
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
704 break;
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 28437
diff changeset
705 }
8822
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
706 #endif
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
707
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
708 case 'f': {/* float */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
709 float *p = va_arg(*p_va, float *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
710 double dval = PyFloat_AsDouble(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
711 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
712 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
713 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
714 *p = (float) dval;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
715 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
716 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
717
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
718 case 'd': {/* double */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
719 double *p = va_arg(*p_va, double *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
720 double dval = PyFloat_AsDouble(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
721 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
722 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
723 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
724 *p = dval;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
725 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
726 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
727
3766
516490c8192c Py_complex; and WITHOUT_COMPLEX added to getargs.c
Guido van Rossum <guido@python.org>
parents: 3323
diff changeset
728 #ifndef WITHOUT_COMPLEX
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
729 case 'D': {/* complex double */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
730 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
731 Py_complex cval;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
732 cval = PyComplex_AsCComplex(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
733 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
734 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
735 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
736 *p = cval;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
737 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
738 }
3766
516490c8192c Py_complex; and WITHOUT_COMPLEX added to getargs.c
Guido van Rossum <guido@python.org>
parents: 3323
diff changeset
739 #endif /* WITHOUT_COMPLEX */
3323
6098aaa8ae7f changes for complex numbers
Guido van Rossum <guido@python.org>
parents: 2210
diff changeset
740
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
741 case 'c': {/* char */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
742 char *p = va_arg(*p_va, char *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
743 if (PyString_Check(arg) && PyString_Size(arg) == 1)
20357
92d56ae63ed3 One more place where PyString_AsString() was used after a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20356
diff changeset
744 *p = PyString_AS_STRING(arg)[0];
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
745 else
21096
cdb70bf88db1 Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21092
diff changeset
746 return converterr("char", arg, msgbuf, bufsize);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
747 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
748 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
749
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
750 case 's': {/* string */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
751 if (*format == '#') {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
752 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
753 FETCH_SIZE;
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
754
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
755 if (PyString_Check(arg)) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
756 *p = PyString_AS_STRING(arg);
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
757 STORE_SIZE(PyString_GET_SIZE(arg));
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
758 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
759 #ifdef Py_USING_UNICODE
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
760 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
761 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
762 if (uarg == NULL)
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
763 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
764 arg, msgbuf, bufsize);
19820
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
765 *p = PyString_AS_STRING(uarg);
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
766 STORE_SIZE(PyString_GET_SIZE(uarg));
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
767 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
768 #endif
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
769 else { /* any buffer-like object */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
770 char *buf;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
771 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
772 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
773 return converterr(buf, arg, msgbuf, bufsize);
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
774 STORE_SIZE(count);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
775 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
776 format++;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
777 } else {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
778 char **p = va_arg(*p_va, char **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
779
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
780 if (PyString_Check(arg))
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
781 *p = PyString_AS_STRING(arg);
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
782 #ifdef Py_USING_UNICODE
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
783 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
784 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
785 if (uarg == NULL)
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
786 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
787 arg, msgbuf, bufsize);
19820
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
788 *p = PyString_AS_STRING(uarg);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
789 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
790 #endif
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
791 else
21096
cdb70bf88db1 Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21092
diff changeset
792 return converterr("string", arg, msgbuf, bufsize);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
793 if ((int)strlen(*p) != PyString_Size(arg))
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
794 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
795 arg, msgbuf, bufsize);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
796 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
797 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
798 }
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
799
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
800 case 'z': {/* string, may be NULL (None) */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
801 if (*format == '#') { /* any buffer-like object */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
802 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
803 FETCH_SIZE;
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
804
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
805 if (arg == Py_None) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
806 *p = 0;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
807 STORE_SIZE(0);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
808 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
809 else if (PyString_Check(arg)) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
810 *p = PyString_AS_STRING(arg);
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
811 STORE_SIZE(PyString_GET_SIZE(arg));
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
812 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
813 #ifdef Py_USING_UNICODE
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
814 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
815 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
816 if (uarg == NULL)
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
817 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
818 arg, msgbuf, bufsize);
19820
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
819 *p = PyString_AS_STRING(uarg);
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
820 STORE_SIZE(PyString_GET_SIZE(uarg));
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
821 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
822 #endif
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
823 else { /* any buffer-like object */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
824 char *buf;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
825 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
826 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
827 return converterr(buf, arg, msgbuf, bufsize);
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
828 STORE_SIZE(count);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
829 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
830 format++;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
831 } else {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
832 char **p = va_arg(*p_va, char **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
833
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
834 if (arg == Py_None)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
835 *p = 0;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
836 else if (PyString_Check(arg))
20356
c0d662966272 Use AS_STRING() following the check and avoid an extra call.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19820
diff changeset
837 *p = PyString_AS_STRING(arg);
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
838 #ifdef Py_USING_UNICODE
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
839 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
840 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
841 if (uarg == NULL)
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
842 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
843 arg, msgbuf, bufsize);
19820
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
844 *p = PyString_AS_STRING(uarg);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
845 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
846 #endif
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
847 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
848 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
849 arg, msgbuf, bufsize);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
850 if (*format == '#') {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
851 FETCH_SIZE;
36773
64ff3b225d48 Fix C99-ism, and add XXX to comment
Thomas Wouters <thomas@python.org>
parents: 36758
diff changeset
852 assert(0); /* XXX redundant with if-case */
12612
5648df74395f Trent Mick:
Guido van Rossum <guido@python.org>
parents: 12570
diff changeset
853 if (arg == Py_None)
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
854 *q = 0;
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
855 else
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
856 *q = PyString_Size(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
857 format++;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
858 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
859 else if (*p != NULL &&
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
860 (int)strlen(*p) != PyString_Size(arg))
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
861 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
862 "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
863 arg, msgbuf, bufsize);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
864 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
865 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
866 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
867
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
868 case 'e': {/* encoded string */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
869 char **buffer;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
870 const char *encoding;
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
871 PyObject *s;
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
872 int size, recode_strings;
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
873
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
874 /* Get 'e' parameter: the encoding name */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
875 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
876 #ifdef Py_USING_UNICODE
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
877 if (encoding == NULL)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
878 encoding = PyUnicode_GetDefaultEncoding();
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
879 #endif
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
880
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
881 /* Get output buffer parameter:
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
882 's' (recode all objects via Unicode) or
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
883 't' (only recode non-string objects)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
884 */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
885 if (*format == 's')
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
886 recode_strings = 1;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
887 else if (*format == 't')
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
888 recode_strings = 0;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
889 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
890 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
891 "(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
892 arg, msgbuf, bufsize);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
893 buffer = (char **)va_arg(*p_va, char **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
894 format++;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
895 if (buffer == NULL)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
896 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
897 arg, msgbuf, bufsize);
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
898
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
899 /* Encode object */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
900 if (!recode_strings && PyString_Check(arg)) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
901 s = arg;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
902 Py_INCREF(s);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
903 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
904 else {
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
905 #ifdef Py_USING_UNICODE
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
906 PyObject *u;
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
907
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
908 /* Convert object to Unicode */
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
909 u = PyUnicode_FromObject(arg);
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
910 if (u == NULL)
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
911 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
912 "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
913 arg, msgbuf, bufsize);
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
914
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
915 /* Encode object; use default error handling */
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
916 s = PyUnicode_AsEncodedString(u,
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
917 encoding,
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
918 NULL);
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
919 Py_DECREF(u);
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
920 if (s == NULL)
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
921 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
922 arg, msgbuf, bufsize);
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
923 if (!PyString_Check(s)) {
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
924 Py_DECREF(s);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
925 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
926 "(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
927 arg, msgbuf, bufsize);
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
928 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
929 #else
21096
cdb70bf88db1 Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21092
diff changeset
930 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
931 #endif
17996
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 size = PyString_GET_SIZE(s);
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
934
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
935 /* 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
936 if (*format == '#') {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
937 /* Using buffer length parameter '#':
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
938
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
939 - 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
940 needed size is allocated and the data
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
941 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
942 to the new buffer; the caller is
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
943 responsible for PyMem_Free()ing it after
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
944 usage
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
945
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
946 - 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
947 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
948 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
949 buffer overflow is signalled with an error;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
950 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
951 encoded string plus the trailing 0-byte
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
952
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
953 - 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
954 the size of the buffer /excluding/ the
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
955 trailing 0-byte
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
956
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
957 */
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
958 FETCH_SIZE;
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
959
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
960 format++;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
961 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
962 Py_DECREF(s);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
963 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
964 "(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
965 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
966 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
967 if (*buffer == NULL) {
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
968 *buffer = PyMem_NEW(char, size + 1);
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
969 if (*buffer == NULL) {
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
970 Py_DECREF(s);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
971 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
972 "(memory error)",
21096
cdb70bf88db1 Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21092
diff changeset
973 arg, msgbuf, bufsize);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
974 }
28952
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
975 if(addcleanup(*buffer, freelist)) {
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
976 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
977 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
978 "(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
979 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
980 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
981 } else {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
982 if (size + 1 > BUFFER_LEN) {
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
983 Py_DECREF(s);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
984 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
985 "(buffer overflow)",
21096
cdb70bf88db1 Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21092
diff changeset
986 arg, msgbuf, bufsize);
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
987 }
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
988 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
989 memcpy(*buffer,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
990 PyString_AS_STRING(s),
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
991 size + 1);
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
992 STORE_SIZE(size);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
993 } else {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
994 /* Using a 0-terminated buffer:
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
995
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
996 - 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
997 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
998 error raised
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
999
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1000 - 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
1001 allocated and the data copied into it;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1002 *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
1003 buffer; the caller is responsible for
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1004 PyMem_Free()ing it after usage
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1005
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1006 */
28952
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
1007 if ((int)strlen(PyString_AS_STRING(s)) != size) {
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
1008 Py_DECREF(s);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1009 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1010 "(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
1011 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
1012 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1013 *buffer = PyMem_NEW(char, size + 1);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1014 if (*buffer == NULL) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1015 Py_DECREF(s);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1016 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
1017 arg, msgbuf, bufsize);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1018 }
28952
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
1019 if(addcleanup(*buffer, freelist)) {
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
1020 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
1021 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
1022 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
1023 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1024 memcpy(*buffer,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1025 PyString_AS_STRING(s),
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1026 size + 1);
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
1027 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1028 Py_DECREF(s);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1029 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1030 }
12570
3dbe41380266 Brian Hooper <brian_takashi@hotmail.com>:
Fred Drake <fdrake@acm.org>
parents: 12510
diff changeset
1031
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
1032 #ifdef Py_USING_UNICODE
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1033 case 'u': {/* raw unicode buffer (Py_UNICODE *) */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1034 if (*format == '#') { /* any buffer-like object */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1035 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
1036 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
1037 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
1038 *p = PyUnicode_AS_UNICODE(arg);
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1039 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
1040 }
0d3bb68e3a28 Fixed "u#" parser marker to pass through Unicode objects as-is without
Marc-André Lemburg <mal@egenix.com>
parents: 21145
diff changeset
1041 else {
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1042 char *buf;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1043 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
1044 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
1045 return converterr(buf, arg, msgbuf, bufsize);
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1046 STORE_SIZE(count/(sizeof(Py_UNICODE)));
21667
0d3bb68e3a28 Fixed "u#" parser marker to pass through Unicode objects as-is without
Marc-André Lemburg <mal@egenix.com>
parents: 21145
diff changeset
1047 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1048 format++;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1049 } else {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1050 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
1051 if (PyUnicode_Check(arg))
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1052 *p = PyUnicode_AS_UNICODE(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1053 else
21096
cdb70bf88db1 Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21092
diff changeset
1054 return converterr("unicode", arg, msgbuf, bufsize);
12570
3dbe41380266 Brian Hooper <brian_takashi@hotmail.com>:
Fred Drake <fdrake@acm.org>
parents: 12510
diff changeset
1055 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1056 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1057 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
1058 #endif
12570
3dbe41380266 Brian Hooper <brian_takashi@hotmail.com>:
Fred Drake <fdrake@acm.org>
parents: 12510
diff changeset
1059
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1060 case 'S': { /* string object */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1061 PyObject **p = va_arg(*p_va, PyObject **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1062 if (PyString_Check(arg))
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1063 *p = arg;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1064 else
21096
cdb70bf88db1 Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21092
diff changeset
1065 return converterr("string", arg, msgbuf, bufsize);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1066 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1067 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
1068
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
1069 #ifdef Py_USING_UNICODE
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1070 case 'U': { /* Unicode object */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1071 PyObject **p = va_arg(*p_va, PyObject **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1072 if (PyUnicode_Check(arg))
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1073 *p = arg;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1074 else
21096
cdb70bf88db1 Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21092
diff changeset
1075 return converterr("unicode", arg, msgbuf, bufsize);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1076 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1077 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
1078 #endif
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1079
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1080 case 'O': { /* object */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1081 PyTypeObject *type;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1082 PyObject **p;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1083 if (*format == '!') {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1084 type = va_arg(*p_va, PyTypeObject*);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1085 p = va_arg(*p_va, PyObject **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1086 format++;
19533
3e7897822459 The "O!" format code should implement an isinstance() test
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
1087 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
1088 *p = arg;
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
1089 else
21096
cdb70bf88db1 Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21092
diff changeset
1090 return converterr(type->tp_name, arg, msgbuf, bufsize);
8358
da4bdceeaad7 Another veeeeeery old patch...
Guido van Rossum <guido@python.org>
parents: 7982
diff changeset
1091
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1092 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1093 else if (*format == '?') {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1094 inquiry pred = va_arg(*p_va, inquiry);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1095 p = va_arg(*p_va, PyObject **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1096 format++;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1097 if ((*pred)(arg))
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1098 *p = arg;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1099 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1100 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
1101 arg, msgbuf, bufsize);
8358
da4bdceeaad7 Another veeeeeery old patch...
Guido van Rossum <guido@python.org>
parents: 7982
diff changeset
1102
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
1103 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1104 else if (*format == '&') {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1105 typedef int (*converter)(PyObject *, void *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1106 converter convert = va_arg(*p_va, converter);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1107 void *addr = va_arg(*p_va, void *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1108 format++;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1109 if (! (*convert)(arg, addr))
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1110 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
1111 arg, msgbuf, bufsize);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1112 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1113 else {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1114 p = va_arg(*p_va, PyObject **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1115 *p = arg;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1116 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1117 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1118 }
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
1119
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
1120
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1121 case 'w': { /* memory buffer, read-write access */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1122 void **p = va_arg(*p_va, void **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1123 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1124 int count;
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
1125
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1126 if (pb == NULL ||
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1127 pb->bf_getwritebuffer == NULL ||
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1128 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
1129 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
1130 if ((*pb->bf_getsegcount)(arg, NULL) != 1)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1131 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
1132 arg, msgbuf, bufsize);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1133 if ((count = pb->bf_getwritebuffer(arg, 0, p)) < 0)
21096
cdb70bf88db1 Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21092
diff changeset
1134 return converterr("(unspecified)", arg, msgbuf, bufsize);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1135 if (*format == '#') {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1136 FETCH_SIZE;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1137 STORE_SIZE(count);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1138 format++;
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
1139 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1140 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1141 }
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
1142
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1143 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
1144 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
1145 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1146 int count;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1147
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1148 if (*format++ != '#')
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1149 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1150 "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
1151 arg, msgbuf, bufsize);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1152 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
1153 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
1154 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
1155 pb->bf_getsegcount == NULL)
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1156 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1157 "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
1158 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
1159
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
1160 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
1161 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
1162 "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
1163 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
1164
8ef3e95182c3 Undo part of 2.59: 't' case of convertsimple() should not use convertbuffer().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20357
diff changeset
1165 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
1166 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
1167 return converterr("(unspecified)", arg, msgbuf, bufsize);
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1168 {
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1169 FETCH_SIZE;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1170 STORE_SIZE(count);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1171 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1172 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1173 }
9306
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
1174
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
1175 default:
21096
cdb70bf88db1 Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21092
diff changeset
1176 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
1177
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
1178 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
1179
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
1180 *p_format = format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
1181 return NULL;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
1182 }
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1183
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1184 static Py_ssize_t
20629
acc7e3b4d042 Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents: 20371
diff changeset
1185 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
1186 {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1187 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
1188 Py_ssize_t count;
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1189 if (pb == NULL ||
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1190 pb->bf_getreadbuffer == NULL ||
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1191 pb->bf_getsegcount == NULL) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1192 *errmsg = "string or read-only buffer";
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1193 return -1;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1194 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1195 if ((*pb->bf_getsegcount)(arg, NULL) != 1) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1196 *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
1197 return -1;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1198 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1199 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
1200 *errmsg = "(unspecified)";
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1201 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1202 return count;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
1203 }
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1204
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1205 /* 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
1206 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
1207
20711
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1208 /* 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
1209 int
acc7e3b4d042 Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents: 20371
diff changeset
1210 PyArg_ParseTupleAndKeywords(PyObject *args,
acc7e3b4d042 Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents: 20371
diff changeset
1211 PyObject *keywords,
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35552
diff changeset
1212 const char *format,
36675
dba6494735d0 Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents: 36625
diff changeset
1213 char **kwlist, ...)
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1214 {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1215 int retval;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1216 va_list va;
20710
a44cc0c21cfe PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents: 20709
diff changeset
1217
a44cc0c21cfe PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents: 20709
diff changeset
1218 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
1219 (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
1220 format == NULL ||
a44cc0c21cfe PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents: 20709
diff changeset
1221 kwlist == NULL)
a44cc0c21cfe PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents: 20709
diff changeset
1222 {
a44cc0c21cfe PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents: 20709
diff changeset
1223 PyErr_BadInternalCall();
20711
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1224 return 0;
20710
a44cc0c21cfe PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents: 20709
diff changeset
1225 }
a44cc0c21cfe PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents: 20709
diff changeset
1226
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1227 va_start(va, kwlist);
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1228 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
1229 va_end(va);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1230 return retval;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1231 }
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1232
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1233 int
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1234 _PyArg_ParseTupleAndKeywords_SizeT(PyObject *args,
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1235 PyObject *keywords,
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1236 const char *format,
36675
dba6494735d0 Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents: 36625
diff changeset
1237 char **kwlist, ...)
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1238 {
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1239 int retval;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1240 va_list va;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1241
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1242 if ((args == NULL || !PyTuple_Check(args)) ||
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1243 (keywords != NULL && !PyDict_Check(keywords)) ||
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1244 format == NULL ||
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1245 kwlist == NULL)
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1246 {
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1247 PyErr_BadInternalCall();
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1248 return 0;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1249 }
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1250
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1251 va_start(va, kwlist);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1252 retval = vgetargskeywords(args, keywords, format,
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1253 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
1254 va_end(va);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1255 return retval;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1256 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1257
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1258
32606
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1259 int
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1260 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
1261 PyObject *keywords,
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35552
diff changeset
1262 const char *format,
36675
dba6494735d0 Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents: 36625
diff changeset
1263 char **kwlist, va_list va)
32606
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1264 {
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1265 int retval;
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1266 va_list lva;
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1267
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1268 if ((args == NULL || !PyTuple_Check(args)) ||
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1269 (keywords != NULL && !PyDict_Check(keywords)) ||
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1270 format == NULL ||
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1271 kwlist == NULL)
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1272 {
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1273 PyErr_BadInternalCall();
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1274 return 0;
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1275 }
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1276
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1277 #ifdef VA_LIST_IS_ARRAY
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1278 memcpy(lva, va, sizeof(va_list));
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1279 #else
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1280 #ifdef __va_copy
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1281 __va_copy(lva, va);
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1282 #else
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1283 lva = va;
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1284 #endif
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1285 #endif
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1286
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1287 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
1288 return retval;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1289 }
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1290
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1291 int
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1292 _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *args,
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1293 PyObject *keywords,
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1294 const char *format,
36675
dba6494735d0 Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents: 36625
diff changeset
1295 char **kwlist, va_list va)
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1296 {
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1297 int retval;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1298 va_list lva;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1299
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1300 if ((args == NULL || !PyTuple_Check(args)) ||
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1301 (keywords != NULL && !PyDict_Check(keywords)) ||
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1302 format == NULL ||
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1303 kwlist == NULL)
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1304 {
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1305 PyErr_BadInternalCall();
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1306 return 0;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1307 }
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1308
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1309 #ifdef VA_LIST_IS_ARRAY
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1310 memcpy(lva, va, sizeof(va_list));
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1311 #else
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1312 #ifdef __va_copy
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1313 __va_copy(lva, va);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1314 #else
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1315 lva = va;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1316 #endif
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1317 #endif
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1318
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1319 retval = vgetargskeywords(args, keywords, format,
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1320 kwlist, &lva, FLAG_SIZE_T);
32606
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1321 return retval;
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1322 }
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1323
cc1f74d19fcb Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents: 28952
diff changeset
1324
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1325 static int
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35552
diff changeset
1326 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
1327 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
1328 {
20721
acb854b897bb vgetargskeywords: Prevent another potential sprintf buffer overrun.
Tim Peters <tim.peters@gmail.com>
parents: 20720
diff changeset
1329 char msgbuf[512];
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1330 int levels[32];
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35552
diff changeset
1331 const char *fname, *message;
20711
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1332 int min, max;
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35552
diff changeset
1333 const char *formatsave;
20722
676f106a5002 vgetargskeywords: Now that it's clear that nkwlist must equal max, and
Tim Peters <tim.peters@gmail.com>
parents: 20721
diff changeset
1334 int i, len, nargs, nkeywords;
36675
dba6494735d0 Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents: 36625
diff changeset
1335 const char *msg;
dba6494735d0 Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents: 36625
diff changeset
1336 char **p;
28952
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
1337 PyObject *freelist = NULL;
20708
e912b683ed3e vgetargskeywords(): remove test that can't succeed. Not a bugfix, just
Tim Peters <tim.peters@gmail.com>
parents: 20632
diff changeset
1338
20710
a44cc0c21cfe PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents: 20709
diff changeset
1339 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
1340 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
1341 assert(format != NULL);
a44cc0c21cfe PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents: 20709
diff changeset
1342 assert(kwlist != NULL);
a44cc0c21cfe PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents: 20709
diff changeset
1343 assert(p_va != NULL);
a44cc0c21cfe PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents: 20709
diff changeset
1344
20711
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1345 /* Search the format:
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1346 message <- error msg, if any (else NULL).
21100
0feac45ee662 SF bug 486278 SystemError: Python/getargs.c:1086: bad.
Tim Peters <tim.peters@gmail.com>
parents: 21096
diff changeset
1347 fname <- routine name, if any (else NULL).
20711
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1348 min <- # of required arguments, or -1 if all are required.
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1349 max <- most arguments (required + optional).
20720
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1350 Check that kwlist has a non-NULL entry for each arg.
20711
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1351 Raise error if a tuple arg spec is found.
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1352 */
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1353 fname = message = NULL;
20713
7f4089519926 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20712
diff changeset
1354 formatsave = format;
20720
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1355 p = kwlist;
20711
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1356 min = -1;
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1357 max = 0;
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1358 while ((i = *format++) != '\0') {
36090
8cb686dd6e64 Fix SF bug #1072182, problems with signed characters.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35999
diff changeset
1359 if (isalpha(Py_CHARMASK(i)) && i != 'e') {
20711
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1360 max++;
20720
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1361 if (*p == NULL) {
21100
0feac45ee662 SF bug 486278 SystemError: Python/getargs.c:1086: bad.
Tim Peters <tim.peters@gmail.com>
parents: 21096
diff changeset
1362 PyErr_SetString(PyExc_RuntimeError,
0feac45ee662 SF bug 486278 SystemError: Python/getargs.c:1086: bad.
Tim Peters <tim.peters@gmail.com>
parents: 21096
diff changeset
1363 "more argument specifiers than "
0feac45ee662 SF bug 486278 SystemError: Python/getargs.c:1086: bad.
Tim Peters <tim.peters@gmail.com>
parents: 21096
diff changeset
1364 "keyword list entries");
20720
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1365 return 0;
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1366 }
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1367 p++;
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1368 }
20711
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1369 else if (i == '|')
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1370 min = max;
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1371 else if (i == ':') {
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1372 fname = format;
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1373 break;
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1374 }
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1375 else if (i == ';') {
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1376 message = format;
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1377 break;
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1378 }
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1379 else if (i == '(') {
21100
0feac45ee662 SF bug 486278 SystemError: Python/getargs.c:1086: bad.
Tim Peters <tim.peters@gmail.com>
parents: 21096
diff changeset
1380 PyErr_SetString(PyExc_RuntimeError,
0feac45ee662 SF bug 486278 SystemError: Python/getargs.c:1086: bad.
Tim Peters <tim.peters@gmail.com>
parents: 21096
diff changeset
1381 "tuple found in format when using keyword "
0feac45ee662 SF bug 486278 SystemError: Python/getargs.c:1086: bad.
Tim Peters <tim.peters@gmail.com>
parents: 21096
diff changeset
1382 "arguments");
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1383 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1384 }
20720
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1385 }
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1386 format = formatsave;
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1387 if (*p != NULL) {
21100
0feac45ee662 SF bug 486278 SystemError: Python/getargs.c:1086: bad.
Tim Peters <tim.peters@gmail.com>
parents: 21096
diff changeset
1388 PyErr_SetString(PyExc_RuntimeError,
0feac45ee662 SF bug 486278 SystemError: Python/getargs.c:1086: bad.
Tim Peters <tim.peters@gmail.com>
parents: 21096
diff changeset
1389 "more keyword list entries than "
0feac45ee662 SF bug 486278 SystemError: Python/getargs.c:1086: bad.
Tim Peters <tim.peters@gmail.com>
parents: 21096
diff changeset
1390 "argument specifiers");
20720
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1391 return 0;
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1392 }
20711
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1393 if (min < 0) {
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1394 /* All arguments are required. */
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1395 min = max;
20711
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1396 }
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1397
20713
7f4089519926 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20712
diff changeset
1398 nargs = PyTuple_GET_SIZE(args);
20714
091f9656d79b vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20713
diff changeset
1399 nkeywords = keywords == NULL ? 0 : PyDict_Size(keywords);
20708
e912b683ed3e vgetargskeywords(): remove test that can't succeed. Not a bugfix, just
Tim Peters <tim.peters@gmail.com>
parents: 20632
diff changeset
1400
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1401 /* make sure there are no duplicate values for an argument;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1402 its not clear when to use the term "keyword argument vs.
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1403 keyword parameter in messages */
20715
5e6f8187bd48 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20714
diff changeset
1404 if (nkeywords > 0) {
20713
7f4089519926 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20712
diff changeset
1405 for (i = 0; i < nargs; i++) {
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35552
diff changeset
1406 const char *thiskw = kwlist[i];
20709
310450e74f2f tuple(3,4,5,x=2) dumped core on my box. vgetargskeywords() overindexed
Tim Peters <tim.peters@gmail.com>
parents: 20708
diff changeset
1407 if (thiskw == NULL)
310450e74f2f tuple(3,4,5,x=2) dumped core on my box. vgetargskeywords() overindexed
Tim Peters <tim.peters@gmail.com>
parents: 20708
diff changeset
1408 break;
20717
84715d52d954 vgetargskeywords: The keywords arg is a dict (if non-NULL), so use the
Tim Peters <tim.peters@gmail.com>
parents: 20716
diff changeset
1409 if (PyDict_GetItemString(keywords, thiskw)) {
20715
5e6f8187bd48 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20714
diff changeset
1410 PyErr_Format(PyExc_TypeError,
5e6f8187bd48 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20714
diff changeset
1411 "keyword parameter '%s' was given "
5e6f8187bd48 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20714
diff changeset
1412 "by position and by name",
20709
310450e74f2f tuple(3,4,5,x=2) dumped core on my box. vgetargskeywords() overindexed
Tim Peters <tim.peters@gmail.com>
parents: 20708
diff changeset
1413 thiskw);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1414 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1415 }
20718
c6384591d846 vgetargskeywords: Removed all PyErr_Clear() calls. It's possible that
Tim Peters <tim.peters@gmail.com>
parents: 20717
diff changeset
1416 else if (PyErr_Occurred())
c6384591d846 vgetargskeywords: Removed all PyErr_Clear() calls. It's possible that
Tim Peters <tim.peters@gmail.com>
parents: 20717
diff changeset
1417 return 0;
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1418 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1419 }
20716
dcf769c12d8b vgetargskeywords: Removed one of the mysterious PyErr_Clear() calls.
Tim Peters <tim.peters@gmail.com>
parents: 20715
diff changeset
1420
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1421 /* required arguments missing from args can be supplied by keyword
36345
Georg Brandl <georg@python.org>
parents: 36093
diff changeset
1422 arguments; set len to the number of positional arguments, and,
20720
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1423 if that's less than the minimum required, add in the number of
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1424 required arguments that are supplied by keywords */
20713
7f4089519926 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20712
diff changeset
1425 len = nargs;
20720
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1426 if (nkeywords > 0 && nargs < min) {
20713
7f4089519926 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20712
diff changeset
1427 for (i = nargs; i < min; i++) {
20717
84715d52d954 vgetargskeywords: The keywords arg is a dict (if non-NULL), so use the
Tim Peters <tim.peters@gmail.com>
parents: 20716
diff changeset
1428 if (PyDict_GetItemString(keywords, kwlist[i]))
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1429 len++;
20718
c6384591d846 vgetargskeywords: Removed all PyErr_Clear() calls. It's possible that
Tim Peters <tim.peters@gmail.com>
parents: 20717
diff changeset
1430 else if (PyErr_Occurred())
c6384591d846 vgetargskeywords: Removed all PyErr_Clear() calls. It's possible that
Tim Peters <tim.peters@gmail.com>
parents: 20717
diff changeset
1431 return 0;
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1432 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1433 }
20718
c6384591d846 vgetargskeywords: Removed all PyErr_Clear() calls. It's possible that
Tim Peters <tim.peters@gmail.com>
parents: 20717
diff changeset
1434
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1435 /* make sure we got an acceptable number of arguments; the message
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1436 is a little confusing with keywords since keyword arguments
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1437 which are supplied, but don't match the required arguments
34846
13d5caa1e9d0 I suppose a bug report or even a fix would be a better response, but
Michael W. Hudson <mwh@python.net>
parents: 34666
diff changeset
1438 are not included in the "%d given" part of the message
13d5caa1e9d0 I suppose a bug report or even a fix would be a better response, but
Michael W. Hudson <mwh@python.net>
parents: 34666
diff changeset
1439 XXX and this isn't a bug!? */
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1440 if (len < min || max < len) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1441 if (message == NULL) {
21074
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
1442 PyOS_snprintf(msgbuf, sizeof(msgbuf),
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
1443 "%.200s%s takes %s %d argument%s "
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
1444 "(%d given)",
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
1445 fname==NULL ? "function" : fname,
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
1446 fname==NULL ? "" : "()",
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
1447 min==max ? "exactly"
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
1448 : len < min ? "at least" : "at most",
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
1449 len < min ? min : max,
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
1450 (len < min ? min : max) == 1 ? "" : "s",
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
1451 len);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1452 message = msgbuf;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1453 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1454 PyErr_SetString(PyExc_TypeError, message);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1455 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1456 }
20723
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1457
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1458 /* convert the positional arguments */
20713
7f4089519926 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20712
diff changeset
1459 for (i = 0; i < nargs; i++) {
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1460 if (*format == '|')
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1461 format++;
17856
2807949e0ba5 vgetargs1() and vgetargskeywords(): Replace uses of PyTuple_Size() and
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17817
diff changeset
1462 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
1463 flags, levels, msgbuf, sizeof(msgbuf),
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1464 &freelist);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1465 if (msg) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1466 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
1467 return cleanreturn(0, freelist);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1468 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1469 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1470
20723
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1471 /* handle no keyword parameters in call */
20715
5e6f8187bd48 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20714
diff changeset
1472 if (nkeywords == 0)
28952
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
1473 return cleanreturn(1, freelist);
20715
5e6f8187bd48 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20714
diff changeset
1474
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1475 /* convert the keyword arguments; this uses the format
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1476 string where it was left after processing args */
20722
676f106a5002 vgetargskeywords: Now that it's clear that nkwlist must equal max, and
Tim Peters <tim.peters@gmail.com>
parents: 20721
diff changeset
1477 for (i = nargs; i < max; i++) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1478 PyObject *item;
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1479 if (*format == '|')
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1480 format++;
20717
84715d52d954 vgetargskeywords: The keywords arg is a dict (if non-NULL), so use the
Tim Peters <tim.peters@gmail.com>
parents: 20716
diff changeset
1481 item = PyDict_GetItemString(keywords, kwlist[i]);
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1482 if (item != NULL) {
20717
84715d52d954 vgetargskeywords: The keywords arg is a dict (if non-NULL), so use the
Tim Peters <tim.peters@gmail.com>
parents: 20716
diff changeset
1483 Py_INCREF(item);
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1484 msg = convertitem(item, &format, p_va, flags, levels,
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1485 msgbuf, sizeof(msgbuf), &freelist);
20717
84715d52d954 vgetargskeywords: The keywords arg is a dict (if non-NULL), so use the
Tim Peters <tim.peters@gmail.com>
parents: 20716
diff changeset
1486 Py_DECREF(item);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1487 if (msg) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1488 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
1489 return cleanreturn(0, freelist);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1490 }
20723
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1491 --nkeywords;
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1492 if (nkeywords == 0)
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1493 break;
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1494 }
20718
c6384591d846 vgetargskeywords: Removed all PyErr_Clear() calls. It's possible that
Tim Peters <tim.peters@gmail.com>
parents: 20717
diff changeset
1495 else if (PyErr_Occurred())
28952
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
1496 return cleanreturn(0, freelist);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1497 else {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1498 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
1499 if (msg) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1500 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
1501 return cleanreturn(0, freelist);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1502 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1503 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1504 }
20715
5e6f8187bd48 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20714
diff changeset
1505
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1506 /* make sure there are no extraneous keyword arguments */
20723
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1507 if (nkeywords > 0) {
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1508 PyObject *key, *value;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1509 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
1510 while (PyDict_Next(keywords, &pos, &key, &value)) {
20723
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1511 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
1512 char *ks;
f0277146aa16 Fix by Greg Chapman from SF bug 534347: Potential AV in vgetargskeywords.
Guido van Rossum <guido@python.org>
parents: 21667
diff changeset
1513 if (!PyString_Check(key)) {
f0277146aa16 Fix by Greg Chapman from SF bug 534347: Potential AV in vgetargskeywords.
Guido van Rossum <guido@python.org>
parents: 21667
diff changeset
1514 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
1515 "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
1516 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
1517 }
f0277146aa16 Fix by Greg Chapman from SF bug 534347: Potential AV in vgetargskeywords.
Guido van Rossum <guido@python.org>
parents: 21667
diff changeset
1518 ks = PyString_AsString(key);
20722
676f106a5002 vgetargskeywords: Now that it's clear that nkwlist must equal max, and
Tim Peters <tim.peters@gmail.com>
parents: 20721
diff changeset
1519 for (i = 0; i < max; i++) {
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1520 if (!strcmp(ks, kwlist[i])) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1521 match = 1;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1522 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1523 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1524 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1525 if (!match) {
20723
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1526 PyErr_Format(PyExc_TypeError,
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1527 "'%s' is an invalid keyword "
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1528 "argument for this function",
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1529 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
1530 return cleanreturn(0, freelist);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1531 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1532 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1533 }
20723
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1534
28952
6c4a04ce965c Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents: 28667
diff changeset
1535 return cleanreturn(1, freelist);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1536 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1537
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1538
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1539 static char *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1540 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
1541 {
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35552
diff changeset
1542 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
1543 char c = *format++;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1544
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1545 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
1546
9b7d117eb4bc Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents: 35449
diff changeset
1547 /* simple codes
9b7d117eb4bc Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents: 35449
diff changeset
1548 * 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
1549
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1550 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
1551 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
1552 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
1553 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
1554 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
1555 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
1556 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
1557 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
1558 #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
1559 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
1560 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
1561 #endif
9b7d117eb4bc Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents: 35449
diff changeset
1562 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
1563 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
1564 #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
1565 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
1566 #endif
9b7d117eb4bc Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents: 35449
diff changeset
1567 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
1568 {
35552
9b7d117eb4bc Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents: 35449
diff changeset
1569 (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
1570 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1571 }
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1572
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1573 case 'n': /* Py_ssize_t */
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1574 {
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1575 (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
1576 break;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1577 }
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1578
35552
9b7d117eb4bc Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents: 35449
diff changeset
1579 /* string codes */
9b7d117eb4bc Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents: 35449
diff changeset
1580
9b7d117eb4bc Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents: 35449
diff changeset
1581 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
1582 {
35552
9b7d117eb4bc Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents: 35449
diff changeset
1583 (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
1584 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
1585 /* 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
1586 goto err;
9b7d117eb4bc Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents: 35449
diff changeset
1587 format++;
9b7d117eb4bc Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents: 35449
diff changeset
1588 /* 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
1589 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1590
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1591 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
1592 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
1593 #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
1594 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
1595 #endif
9b7d117eb4bc Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents: 35449
diff changeset
1596 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
1597 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
1598 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1599 (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
1600 if (*format == '#') {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1601 if (flags & FLAG_SIZE_T)
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1602 (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
1603 else
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36345
diff changeset
1604 (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
1605 format++;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1606 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1607 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1608 }
35552
9b7d117eb4bc Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents: 35449
diff changeset
1609
9b7d117eb4bc Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents: 35449
diff changeset
1610 /* object codes */
9b7d117eb4bc Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents: 35449
diff changeset
1611
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1612 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
1613 #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
1614 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
1615 #endif
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1616 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1617 (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
1618 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1619 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1620
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1621 case 'O': /* object */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1622 {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1623 if (*format == '!') {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1624 format++;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1625 (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
1626 (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
1627 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1628 #if 0
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1629 /* 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
1630 else if (*format == '?') {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1631 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
1632 format++;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1633 if ((*pred)(arg)) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1634 (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
1635 }
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 #endif
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1638 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
1639 typedef int (*converter)(PyObject *, void *);
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1640 (void) va_arg(*p_va, converter);
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1641 (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
1642 format++;
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 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1645 (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
1646 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1647 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1648 }
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 default:
35552
9b7d117eb4bc Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents: 35449
diff changeset
1651 err:
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1652 return "impossible<bad format char>";
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1653
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1654 }
35552
9b7d117eb4bc Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents: 35449
diff changeset
1655
9b7d117eb4bc Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents: 35449
diff changeset
1656 /* The "(...)" format code for tuples is not handled here because
9b7d117eb4bc Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents: 35449
diff changeset
1657 * it is not allowed with keyword args. */
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1658
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1659 *p_format = format;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1660 return NULL;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1661 }
20632
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1662
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1663
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1664 int
36750
92ba72484ff3 Use Py_ssize_t for PyArg_UnpackTuple arguments.
Martin v. Löwis <martin@v.loewis.de>
parents: 36675
diff changeset
1665 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
1666 {
36750
92ba72484ff3 Use Py_ssize_t for PyArg_UnpackTuple arguments.
Martin v. Löwis <martin@v.loewis.de>
parents: 36675
diff changeset
1667 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
1668 PyObject **o;
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1669 va_list vargs;
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1670
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1671 #ifdef HAVE_STDARG_PROTOTYPES
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1672 va_start(vargs, max);
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1673 #else
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1674 va_start(vargs);
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1675 #endif
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1676
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1677 assert(min >= 0);
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1678 assert(min <= max);
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1679 if (!PyTuple_Check(args)) {
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1680 PyErr_SetString(PyExc_SystemError,
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1681 "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
1682 return 0;
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1683 }
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1684 l = PyTuple_GET_SIZE(args);
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1685 if (l < min) {
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1686 if (name != NULL)
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1687 PyErr_Format(
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1688 PyExc_TypeError,
36758
3e19271efc46 Use %zd format characters for Py_ssize_t types.
Thomas Wouters <thomas@python.org>
parents: 36750
diff changeset
1689 "%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
1690 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
1691 else
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1692 PyErr_Format(
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1693 PyExc_TypeError,
36758
3e19271efc46 Use %zd format characters for Py_ssize_t types.
Thomas Wouters <thomas@python.org>
parents: 36750
diff changeset
1694 "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
1695 " but has %zd",
20632
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1696 (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
1697 va_end(vargs);
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1698 return 0;
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1699 }
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1700 if (l > max) {
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1701 if (name != NULL)
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1702 PyErr_Format(
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1703 PyExc_TypeError,
36758
3e19271efc46 Use %zd format characters for Py_ssize_t types.
Thomas Wouters <thomas@python.org>
parents: 36750
diff changeset
1704 "%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
1705 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
1706 else
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1707 PyErr_Format(
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1708 PyExc_TypeError,
36758
3e19271efc46 Use %zd format characters for Py_ssize_t types.
Thomas Wouters <thomas@python.org>
parents: 36750
diff changeset
1709 "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
1710 " but has %zd",
20632
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1711 (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
1712 va_end(vargs);
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1713 return 0;
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1714 }
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1715 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
1716 o = va_arg(vargs, PyObject **);
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1717 *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
1718 }
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1719 va_end(vargs);
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1720 return 1;
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1721 }
35449
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 34846
diff changeset
1722
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 34846
diff changeset
1723
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 34846
diff changeset
1724 /* 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
1725 *
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 34846
diff changeset
1726 * Sets a TypeError and returns 0 if the kwds dict is
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 34846
diff changeset
1727 * not emtpy, returns 1 otherwise
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 34846
diff changeset
1728 */
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 34846
diff changeset
1729 int
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35552
diff changeset
1730 _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
1731 {
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 34846
diff changeset
1732 if (kw == NULL)
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 34846
diff changeset
1733 return 1;
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 34846
diff changeset
1734 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
1735 PyErr_BadInternalCall();
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 34846
diff changeset
1736 return 0;
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 34846
diff changeset
1737 }
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 34846
diff changeset
1738 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
1739 return 1;
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 34846
diff changeset
1740
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 34846
diff changeset
1741 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
1742 funcname);
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 34846
diff changeset
1743 return 0;
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 34846
diff changeset
1744 }