annotate Python/getargs.c @ 41611:c48fe4dc34a9

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