annotate Python/getargs.c @ 76329:005fd1fe31ab

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