annotate Python/getargs.c @ 21074:47ea73fd7e6b legacy-trunk

Use PyOS_snprintf when possible.
author Jeremy Hylton <jeremy@alum.mit.edu>
date Wed, 28 Nov 2001 20:29:22 +0000
parents 225c7dd17e37
children 53270d281bf0
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
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13378
diff changeset
9 int PyArg_Parse(PyObject *, char *, ...);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13378
diff changeset
10 int PyArg_ParseTuple(PyObject *, char *, ...);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13378
diff changeset
11 int PyArg_VaParse(PyObject *, char *, va_list);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
12
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13378
diff changeset
13 int PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13378
diff changeset
14 char *, char **, ...);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
15
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 /* Forward */
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13378
diff changeset
17 static int vgetargs1(PyObject *, char *, va_list *, int);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13378
diff changeset
18 static void seterror(int, char *, int *, char *, char *);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13378
diff changeset
19 static char *convertitem(PyObject *, char **, va_list *, int *, char *);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13378
diff changeset
20 static char *converttuple(PyObject *, char **, va_list *,
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13378
diff changeset
21 int *, char *, int);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13378
diff changeset
22 static char *convertsimple(PyObject *, char **, va_list *, char *);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
23 static int convertbuffer(PyObject *, void **p, char **);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
24
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13378
diff changeset
25 static int vgetargskeywords(PyObject *, PyObject *,
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13378
diff changeset
26 char *, char **, va_list *);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13378
diff changeset
27 static char *skipitem(char **, va_list *);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
28
20629
acc7e3b4d042 Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents: 20371
diff changeset
29 int
acc7e3b4d042 Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents: 20371
diff changeset
30 PyArg_Parse(PyObject *args, char *format, ...)
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 int retval;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 va_list va;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
34
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 va_start(va, format);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
36 retval = vgetargs1(args, format, &va, 1);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 va_end(va);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 return retval;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
40
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
41
20629
acc7e3b4d042 Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents: 20371
diff changeset
42 int
acc7e3b4d042 Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents: 20371
diff changeset
43 PyArg_ParseTuple(PyObject *args, char *format, ...)
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 int retval;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 va_list va;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
47
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 va_start(va, format);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
49 retval = vgetargs1(args, format, &va, 0);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 va_end(va);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 return retval;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 }
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
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
56 PyArg_VaParse(PyObject *args, char *format, va_list va)
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 {
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
58 va_list lva;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
59
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
60 #ifdef VA_LIST_IS_ARRAY
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
61 memcpy(lva, va, sizeof(va_list));
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
62 #else
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
63 lva = va;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
64 #endif
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
65
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
66 return vgetargs1(args, format, &lva, 0);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
68
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
69
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 static int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
71 vgetargs1(PyObject *args, char *format, va_list *p_va, int compat)
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 char msgbuf[256];
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 int levels[32];
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 char *fname = NULL;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 char *message = NULL;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 int min = -1;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 int max = 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 int level = 0;
17997
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
80 int endfmt = 0;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 char *formatsave = format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
82 int i, len;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
83 char *msg;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
84
16582
9a8e961b505f Related to SF bug 132008 (PyList_Reverse blows up).
Tim Peters <tim.peters@gmail.com>
parents: 16264
diff changeset
85 assert(compat || (args != (PyObject*)NULL));
9a8e961b505f Related to SF bug 132008 (PyList_Reverse blows up).
Tim Peters <tim.peters@gmail.com>
parents: 16264
diff changeset
86
17997
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
87 while (endfmt == 0) {
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 int c = *format++;
17997
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
89 switch (c) {
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
90 case '(':
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 if (level == 0)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 max++;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 level++;
17997
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
94 break;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
95 case ')':
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 if (level == 0)
17997
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
97 Py_FatalError("excess ')' in getargs format");
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 else
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 level--;
17997
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
100 break;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
101 case '\0':
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
102 endfmt = 1;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
103 break;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
104 case ':':
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
105 fname = format;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
106 endfmt = 1;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 break;
17997
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
108 case ';':
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
109 message = format;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
110 endfmt = 1;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
111 break;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
112 default:
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
113 if (level == 0) {
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
114 if (c == 'O')
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
115 max++;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
116 else if (isalpha(c)) {
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
117 if (c != 'e') /* skip encoded */
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
118 max++;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
119 } else if (c == '|')
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
120 min = max;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
121 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 break;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
124 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
125
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
126 if (level != 0)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
127 Py_FatalError(/* '(' */ "missing ')' in getargs format");
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 if (min < 0)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
130 min = max;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
131
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
132 format = formatsave;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
133
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
134 if (compat) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
135 if (max == 0) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
136 if (args == NULL)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
137 return 1;
21074
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
138 PyOS_snprintf(msgbuf, sizeof(msgbuf),
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
139 "%.200s%s takes no arguments",
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
140 fname==NULL ? "function" : fname,
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
141 fname==NULL ? "" : "()");
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
142 PyErr_SetString(PyExc_TypeError, msgbuf);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
143 return 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
144 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 else if (min == 1 && max == 1) {
2004
7f8719a36662 prevent core dump for old getargs() with NULL arg
Guido van Rossum <guido@python.org>
parents: 1913
diff changeset
146 if (args == NULL) {
21074
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
147 PyOS_snprintf(msgbuf, sizeof(msgbuf),
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
148 "%.200s%s takes at least one argument",
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
149 fname==NULL ? "function" : fname,
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
150 fname==NULL ? "" : "()");
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
151 PyErr_SetString(PyExc_TypeError, msgbuf);
2004
7f8719a36662 prevent core dump for old getargs() with NULL arg
Guido van Rossum <guido@python.org>
parents: 1913
diff changeset
152 return 0;
7f8719a36662 prevent core dump for old getargs() with NULL arg
Guido van Rossum <guido@python.org>
parents: 1913
diff changeset
153 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
154 msg = convertitem(args, &format, p_va, levels, msgbuf);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
155 if (msg == NULL)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
156 return 1;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
157 seterror(levels[0], msg, levels+1, fname, message);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
158 return 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
159 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
160 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
161 PyErr_SetString(PyExc_SystemError,
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
162 "old style getargs format uses new features");
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
163 return 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
164 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
165 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
166
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
167 if (!PyTuple_Check(args)) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
168 PyErr_SetString(PyExc_SystemError,
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
169 "new style getargs format but argument is not a tuple");
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
170 return 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
171 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
172
17856
2807949e0ba5 vgetargs1() and vgetargskeywords(): Replace uses of PyTuple_Size() and
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17817
diff changeset
173 len = PyTuple_GET_SIZE(args);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
174
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
175 if (len < min || max < len) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
176 if (message == NULL) {
21074
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
177 PyOS_snprintf(msgbuf, sizeof(msgbuf),
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
178 "%.150s%s takes %s %d argument%s "
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
179 "(%d given)",
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
180 fname==NULL ? "function" : fname,
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
181 fname==NULL ? "" : "()",
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
182 min==max ? "exactly"
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
183 : len < min ? "at least" : "at most",
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
184 len < min ? min : max,
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
185 (len < min ? min : max) == 1 ? "" : "s",
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
186 len);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
187 message = msgbuf;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
188 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
189 PyErr_SetString(PyExc_TypeError, message);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
190 return 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
191 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
192
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
193 for (i = 0; i < len; i++) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
194 if (*format == '|')
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
195 format++;
17856
2807949e0ba5 vgetargs1() and vgetargskeywords(): Replace uses of PyTuple_Size() and
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17817
diff changeset
196 msg = convertitem(PyTuple_GET_ITEM(args, i), &format, p_va,
2807949e0ba5 vgetargs1() and vgetargskeywords(): Replace uses of PyTuple_Size() and
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17817
diff changeset
197 levels, msgbuf);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
198 if (msg) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
199 seterror(i+1, msg, levels, fname, message);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
200 return 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
201 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
202 }
6805
93e480dedcf0 Add explicit check for correct next character in format at end of
Guido van Rossum <guido@python.org>
parents: 5410
diff changeset
203
7982
a909a2869ac5 Make new gcc -Wall happy
Guido van Rossum <guido@python.org>
parents: 7120
diff changeset
204 if (*format != '\0' && !isalpha((int)(*format)) &&
6923
74ad26825060 Oops -- '(' is also a legal start character of a new format...
Guido van Rossum <guido@python.org>
parents: 6805
diff changeset
205 *format != '(' &&
6805
93e480dedcf0 Add explicit check for correct next character in format at end of
Guido van Rossum <guido@python.org>
parents: 5410
diff changeset
206 *format != '|' && *format != ':' && *format != ';') {
93e480dedcf0 Add explicit check for correct next character in format at end of
Guido van Rossum <guido@python.org>
parents: 5410
diff changeset
207 PyErr_Format(PyExc_SystemError,
7120
0efed4d3323b Protect PyErr_Format format string argument from overflow (ironically,
Guido van Rossum <guido@python.org>
parents: 6923
diff changeset
208 "bad format string: %.200s", formatsave);
6805
93e480dedcf0 Add explicit check for correct next character in format at end of
Guido van Rossum <guido@python.org>
parents: 5410
diff changeset
209 return 0;
93e480dedcf0 Add explicit check for correct next character in format at end of
Guido van Rossum <guido@python.org>
parents: 5410
diff changeset
210 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
211
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
212 return 1;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
213 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
214
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
215
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
216
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
217 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
218 seterror(int iarg, char *msg, int *levels, char *fname, char *message)
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
219 {
21066
225c7dd17e37 Fixes for possible buffer overflows in sprintf() usages.
Marc-André Lemburg <mal@egenix.com>
parents: 20723
diff changeset
220 char buf[512];
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
221 int i;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
222 char *p = buf;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
223
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
224 if (PyErr_Occurred())
2210
e734c7235727 don't overwrite error already set (e.g. from O&)
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
225 return;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
226 else if (message == NULL) {
21074
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
227 /* XXX snprintf */
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
228 if (fname != NULL) {
21066
225c7dd17e37 Fixes for possible buffer overflows in sprintf() usages.
Marc-André Lemburg <mal@egenix.com>
parents: 20723
diff changeset
229 sprintf(p, "%.200s() ", fname);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
230 p += strlen(p);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
231 }
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
232 if (iarg != 0) {
152814f6cd11 This patch makes sure that the function name always appears in the error
Ka-Ping Yee <ping@zesty.ca>
parents: 15502
diff changeset
233 sprintf(p, "argument %d", iarg);
152814f6cd11 This patch makes sure that the function name always appears in the error
Ka-Ping Yee <ping@zesty.ca>
parents: 15502
diff changeset
234 i = 0;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
235 p += strlen(p);
21066
225c7dd17e37 Fixes for possible buffer overflows in sprintf() usages.
Marc-André Lemburg <mal@egenix.com>
parents: 20723
diff changeset
236 while (levels[i] > 0 && (int)(p-buf) < 220) {
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
237 sprintf(p, ", item %d", levels[i]-1);
152814f6cd11 This patch makes sure that the function name always appears in the error
Ka-Ping Yee <ping@zesty.ca>
parents: 15502
diff changeset
238 p += strlen(p);
152814f6cd11 This patch makes sure that the function name always appears in the error
Ka-Ping Yee <ping@zesty.ca>
parents: 15502
diff changeset
239 i++;
152814f6cd11 This patch makes sure that the function name always appears in the error
Ka-Ping Yee <ping@zesty.ca>
parents: 15502
diff changeset
240 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
241 }
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
242 else {
152814f6cd11 This patch makes sure that the function name always appears in the error
Ka-Ping Yee <ping@zesty.ca>
parents: 15502
diff changeset
243 sprintf(p, "argument");
152814f6cd11 This patch makes sure that the function name always appears in the error
Ka-Ping Yee <ping@zesty.ca>
parents: 15502
diff changeset
244 p += strlen(p);
152814f6cd11 This patch makes sure that the function name always appears in the error
Ka-Ping Yee <ping@zesty.ca>
parents: 15502
diff changeset
245 }
21066
225c7dd17e37 Fixes for possible buffer overflows in sprintf() usages.
Marc-André Lemburg <mal@egenix.com>
parents: 20723
diff changeset
246 sprintf(p, " %.256s", msg);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
247 message = buf;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
248 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
249 PyErr_SetString(PyExc_TypeError, message);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
250 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
251
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
252
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
253 /* Convert a tuple argument.
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
254 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
255 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
256 If successful:
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
257 *p_format and *p_va are updated,
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
258 *levels and *msgbuf are untouched,
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
259 and NULL is returned.
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
260 If the argument is invalid:
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
261 *p_format is unchanged,
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
262 *p_va is undefined,
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
263 *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
264 *msgbuf contains an error message, whose format is:
15899
152814f6cd11 This patch makes sure that the function name always appears in the error
Ka-Ping Yee <ping@zesty.ca>
parents: 15502
diff changeset
265 "must be <typename1>, not <typename2>", where:
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
266 <typename1> is the name of the expected type, and
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
267 <typename2> is the name of the actual type,
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
268 and msgbuf is returned.
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
269 */
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
270
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
271 static char *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
272 converttuple(PyObject *arg, char **p_format, va_list *p_va, int *levels,
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
273 char *msgbuf, int toplevel)
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
274 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
275 int level = 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
276 int n = 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
277 char *format = *p_format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
278 int i;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
279
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
280 for (;;) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
281 int c = *format++;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
282 if (c == '(') {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
283 if (level == 0)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
284 n++;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
285 level++;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
286 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
287 else if (c == ')') {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
288 if (level == 0)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
289 break;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
290 level--;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
291 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
292 else if (c == ':' || c == ';' || c == '\0')
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
293 break;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
294 else if (level == 0 && isalpha(c))
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
295 n++;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
296 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
297
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
298 if (!PySequence_Check(arg) || PyString_Check(arg)) {
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
299 levels[0] = 0;
21074
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
300 PyOS_snprintf(msgbuf, sizeof(msgbuf),
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
301 toplevel ? "expected %d arguments, not %.50s" :
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
302 "must be %d-item sequence, not %.50s",
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
303 n,
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
304 arg == Py_None ? "None" : arg->ob_type->tp_name);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
305 return msgbuf;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
306 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
307
13576
61e4c29d53d8 replace PyXXX_Length calls with PyXXX_Size calls
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 13447
diff changeset
308 if ((i = PySequence_Size(arg)) != n) {
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
309 levels[0] = 0;
21074
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
310 PyOS_snprintf(msgbuf, sizeof(msgbuf),
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
311 toplevel ? "expected %d arguments, not %d" :
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
312 "must be sequence of length %d, not %d",
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
313 n, i);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
314 return msgbuf;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
315 }
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
316
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
317 format = *p_format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
318 for (i = 0; i < n; i++) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
319 char *msg;
10220
0ef1071cb7fe Patch by Tommy Burnette to accept an arbitrary sequence when "(...)"
Guido van Rossum <guido@python.org>
parents: 9949
diff changeset
320 PyObject *item;
0ef1071cb7fe Patch by Tommy Burnette to accept an arbitrary sequence when "(...)"
Guido van Rossum <guido@python.org>
parents: 9949
diff changeset
321 item = PySequence_GetItem(arg, i);
0ef1071cb7fe Patch by Tommy Burnette to accept an arbitrary sequence when "(...)"
Guido van Rossum <guido@python.org>
parents: 9949
diff changeset
322 msg = convertitem(item, &format, p_va, levels+1, msgbuf);
0ef1071cb7fe Patch by Tommy Burnette to accept an arbitrary sequence when "(...)"
Guido van Rossum <guido@python.org>
parents: 9949
diff changeset
323 /* PySequence_GetItem calls tp->sq_item, which INCREFs */
0ef1071cb7fe Patch by Tommy Burnette to accept an arbitrary sequence when "(...)"
Guido van Rossum <guido@python.org>
parents: 9949
diff changeset
324 Py_XDECREF(item);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
325 if (msg != NULL) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
326 levels[0] = i+1;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
327 return msg;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
328 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
329 }
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
330
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
331 *p_format = format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
332 return NULL;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
333 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
334
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
335
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
336 /* Convert a single item. */
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
337
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
338 static char *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
339 convertitem(PyObject *arg, char **p_format, va_list *p_va, int *levels,
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
340 char *msgbuf)
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
341 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
342 char *msg;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
343 char *format = *p_format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
344
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
345 if (*format == '(' /* ')' */) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
346 format++;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
347 msg = converttuple(arg, &format, p_va, levels, msgbuf, 0);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
348 if (msg == NULL)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
349 format++;
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 else {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
352 msg = convertsimple(arg, &format, p_va, msgbuf);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
353 if (msg != NULL)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
354 levels[0] = 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
355 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
356 if (msg == NULL)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
357 *p_format = format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
358 return msg;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
359 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
360
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
361
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
362
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
363 #define UNICODE_DEFAULT_ENCODING(arg) \
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
364 _PyUnicode_AsDefaultEncodedString(arg, NULL)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
365
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
366 /* 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
367
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
368 static char *
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
369 converterr(char *expected, PyObject *arg, char *msgbuf)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
370 {
19820
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
371 assert(expected != NULL);
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
372 assert(arg != NULL);
21074
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
373 /* XXX use snprintf? */
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
374 sprintf(msgbuf,
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
375 "must be %.50s, not %.50s", expected,
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
376 arg == Py_None ? "None" : arg->ob_type->tp_name);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
377 return msgbuf;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
378 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
379
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
380 #define CONV_UNICODE "(unicode conversion error)"
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
381
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
382 /* 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
383 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
384 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
385 When failing, an exception may or may not have been raised.
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
386 Don't call if a tuple is expected.
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
387 */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
388
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
389 static char *
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
390 convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
391 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
392 char *format = *p_format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
393 char c = *format++;
19820
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
394 PyObject *uarg;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
395
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
396 switch (c) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
397
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
398 case 'b': { /* unsigned byte -- very short int */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
399 char *p = va_arg(*p_va, char *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
400 long ival = PyInt_AsLong(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
401 if (ival == -1 && PyErr_Occurred())
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
402 return converterr("integer<b>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
403 else if (ival < 0) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
404 PyErr_SetString(PyExc_OverflowError,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
405 "unsigned byte integer is less than minimum");
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
406 return converterr("integer<b>", arg, msgbuf);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
407 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
408 else if (ival > UCHAR_MAX) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
409 PyErr_SetString(PyExc_OverflowError,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
410 "unsigned byte integer is greater than maximum");
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
411 return converterr("integer<b>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
412 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
413 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
414 *p = (unsigned char) ival;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
415 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
416 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
417
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
418 case 'B': {/* byte sized bitfield - both signed and unsigned
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
419 values allowed */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
420 char *p = va_arg(*p_va, char *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
421 long ival = PyInt_AsLong(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
422 if (ival == -1 && PyErr_Occurred())
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
423 return converterr("integer<b>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
424 else if (ival < SCHAR_MIN) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
425 PyErr_SetString(PyExc_OverflowError,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
426 "byte-sized integer bitfield is less than minimum");
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
427 return converterr("integer<B>", arg, msgbuf);
13872
35fc9511a36f Changed H specifier to mean "bitfield", i.e. any value from
Jack Jansen <jack.jansen@cwi.nl>
parents: 13837
diff changeset
428 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
429 else if (ival > (int)UCHAR_MAX) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
430 PyErr_SetString(PyExc_OverflowError,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
431 "byte-sized integer bitfield is greater than maximum");
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
432 return converterr("integer<B>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
433 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
434 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
435 *p = (unsigned char) ival;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
436 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
437 }
13872
35fc9511a36f Changed H specifier to mean "bitfield", i.e. any value from
Jack Jansen <jack.jansen@cwi.nl>
parents: 13837
diff changeset
438
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
439 case 'h': {/* signed short int */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
440 short *p = va_arg(*p_va, short *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
441 long ival = PyInt_AsLong(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
442 if (ival == -1 && PyErr_Occurred())
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
443 return converterr("integer<h>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
444 else if (ival < SHRT_MIN) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
445 PyErr_SetString(PyExc_OverflowError,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
446 "signed short integer is less than minimum");
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
447 return converterr("integer<h>", arg, msgbuf);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
448 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
449 else if (ival > SHRT_MAX) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
450 PyErr_SetString(PyExc_OverflowError,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
451 "signed short integer is greater than maximum");
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
452 return converterr("integer<h>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
453 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
454 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
455 *p = (short) ival;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
456 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
457 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
458
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
459 case 'H': { /* short int sized bitfield, both signed and
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
460 unsigned allowed */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
461 unsigned short *p = va_arg(*p_va, unsigned short *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
462 long ival = PyInt_AsLong(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
463 if (ival == -1 && PyErr_Occurred())
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
464 return converterr("integer<H>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
465 else if (ival < SHRT_MIN) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
466 PyErr_SetString(PyExc_OverflowError,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
467 "short integer bitfield is less than minimum");
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
468 return converterr("integer<H>", arg, msgbuf);
13378
113d833eea7e Added support for H (unsigned short) specifier in PyArg_ParseTuple and
Jack Jansen <jack.jansen@cwi.nl>
parents: 13268
diff changeset
469 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
470 else if (ival > USHRT_MAX) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
471 PyErr_SetString(PyExc_OverflowError,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
472 "short integer bitfield is greater than maximum");
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
473 return converterr("integer<H>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
474 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
475 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
476 *p = (unsigned short) ival;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
477 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
478 }
13378
113d833eea7e Added support for H (unsigned short) specifier in PyArg_ParseTuple and
Jack Jansen <jack.jansen@cwi.nl>
parents: 13268
diff changeset
479
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
480 case 'i': {/* signed int */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
481 int *p = va_arg(*p_va, int *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
482 long ival = PyInt_AsLong(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
483 if (ival == -1 && PyErr_Occurred())
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
484 return converterr("integer<i>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
485 else if (ival > INT_MAX) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
486 PyErr_SetString(PyExc_OverflowError,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
487 "signed integer is greater than maximum");
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
488 return converterr("integer<i>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
489 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
490 else if (ival < INT_MIN) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
491 PyErr_SetString(PyExc_OverflowError,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
492 "signed integer is less than minimum");
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
493 return converterr("integer<i>", arg, msgbuf);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
494 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
495 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
496 *p = ival;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
497 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
498 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
499
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
500 case 'l': {/* long int */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
501 long *p = va_arg(*p_va, long *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
502 long ival = PyInt_AsLong(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
503 if (ival == -1 && PyErr_Occurred())
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
504 return converterr("integer<l>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
505 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
506 *p = ival;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
507 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
508 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
509
9949
98e37347378b Change rare occurrences of #if HAVE_LONG_LONG to #ifdef.
Guido van Rossum <guido@python.org>
parents: 9306
diff changeset
510 #ifdef HAVE_LONG_LONG
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
511 case 'L': {/* LONG_LONG */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
512 LONG_LONG *p = va_arg( *p_va, LONG_LONG * );
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
513 LONG_LONG ival = PyLong_AsLongLong( arg );
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
514 if( ival == (LONG_LONG)-1 && PyErr_Occurred() ) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
515 return converterr("long<L>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
516 } else {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
517 *p = ival;
8822
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
518 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
519 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
520 }
8822
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
521 #endif
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
522
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
523 case 'f': {/* float */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
524 float *p = va_arg(*p_va, float *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
525 double dval = PyFloat_AsDouble(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
526 if (PyErr_Occurred())
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
527 return converterr("float<f>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
528 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
529 *p = (float) dval;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
530 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
531 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
532
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
533 case 'd': {/* double */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
534 double *p = va_arg(*p_va, double *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
535 double dval = PyFloat_AsDouble(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
536 if (PyErr_Occurred())
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
537 return converterr("float<d>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
538 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
539 *p = dval;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
540 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
541 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
542
3766
516490c8192c Py_complex; and WITHOUT_COMPLEX added to getargs.c
Guido van Rossum <guido@python.org>
parents: 3323
diff changeset
543 #ifndef WITHOUT_COMPLEX
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
544 case 'D': {/* complex double */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
545 Py_complex *p = va_arg(*p_va, Py_complex *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
546 Py_complex cval;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
547 cval = PyComplex_AsCComplex(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
548 if (PyErr_Occurred())
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
549 return converterr("complex<D>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
550 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
551 *p = cval;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
552 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
553 }
3766
516490c8192c Py_complex; and WITHOUT_COMPLEX added to getargs.c
Guido van Rossum <guido@python.org>
parents: 3323
diff changeset
554 #endif /* WITHOUT_COMPLEX */
3323
6098aaa8ae7f changes for complex numbers
Guido van Rossum <guido@python.org>
parents: 2210
diff changeset
555
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
556 case 'c': {/* char */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
557 char *p = va_arg(*p_va, char *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
558 if (PyString_Check(arg) && PyString_Size(arg) == 1)
20357
92d56ae63ed3 One more place where PyString_AsString() was used after a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20356
diff changeset
559 *p = PyString_AS_STRING(arg)[0];
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
560 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
561 return converterr("char", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
562 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
563 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
564
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
565 case 's': {/* string */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
566 if (*format == '#') {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
567 void **p = (void **)va_arg(*p_va, char **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
568 int *q = va_arg(*p_va, int *);
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
569
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
570 if (PyString_Check(arg)) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
571 *p = PyString_AS_STRING(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
572 *q = PyString_GET_SIZE(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
573 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
574 #ifdef Py_USING_UNICODE
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
575 else if (PyUnicode_Check(arg)) {
19820
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
576 uarg = UNICODE_DEFAULT_ENCODING(arg);
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
577 if (uarg == NULL)
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
578 return converterr(CONV_UNICODE,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
579 arg, msgbuf);
19820
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
580 *p = PyString_AS_STRING(uarg);
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
581 *q = PyString_GET_SIZE(uarg);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
582 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
583 #endif
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
584 else { /* any buffer-like object */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
585 char *buf;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
586 int count = convertbuffer(arg, p, &buf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
587 if (count < 0)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
588 return converterr(buf, arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
589 *q = count;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
590 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
591 format++;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
592 } else {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
593 char **p = va_arg(*p_va, char **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
594
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
595 if (PyString_Check(arg))
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
596 *p = PyString_AS_STRING(arg);
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
597 #ifdef Py_USING_UNICODE
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
598 else if (PyUnicode_Check(arg)) {
19820
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
599 uarg = UNICODE_DEFAULT_ENCODING(arg);
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
600 if (uarg == NULL)
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
601 return converterr(CONV_UNICODE,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
602 arg, msgbuf);
19820
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
603 *p = PyString_AS_STRING(uarg);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
604 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
605 #endif
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
606 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
607 return converterr("string", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
608 if ((int)strlen(*p) != PyString_Size(arg))
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
609 return converterr("string without null bytes",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
610 arg, msgbuf);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
611 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
612 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
613 }
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
614
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
615 case 'z': {/* string, may be NULL (None) */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
616 if (*format == '#') { /* any buffer-like object */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
617 void **p = (void **)va_arg(*p_va, char **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
618 int *q = va_arg(*p_va, int *);
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
619
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
620 if (arg == Py_None) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
621 *p = 0;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
622 *q = 0;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
623 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
624 else if (PyString_Check(arg)) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
625 *p = PyString_AS_STRING(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
626 *q = PyString_GET_SIZE(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
627 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
628 #ifdef Py_USING_UNICODE
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
629 else if (PyUnicode_Check(arg)) {
19820
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
630 uarg = UNICODE_DEFAULT_ENCODING(arg);
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
631 if (uarg == NULL)
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
632 return converterr(CONV_UNICODE,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
633 arg, msgbuf);
19820
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
634 *p = PyString_AS_STRING(uarg);
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
635 *q = PyString_GET_SIZE(uarg);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
636 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
637 #endif
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
638 else { /* any buffer-like object */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
639 char *buf;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
640 int count = convertbuffer(arg, p, &buf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
641 if (count < 0)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
642 return converterr(buf, arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
643 *q = count;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
644 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
645 format++;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
646 } else {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
647 char **p = va_arg(*p_va, char **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
648
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
649 if (arg == Py_None)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
650 *p = 0;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
651 else if (PyString_Check(arg))
20356
c0d662966272 Use AS_STRING() following the check and avoid an extra call.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19820
diff changeset
652 *p = PyString_AS_STRING(arg);
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
653 #ifdef Py_USING_UNICODE
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
654 else if (PyUnicode_Check(arg)) {
19820
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
655 uarg = UNICODE_DEFAULT_ENCODING(arg);
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
656 if (uarg == NULL)
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
657 return converterr(CONV_UNICODE,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
658 arg, msgbuf);
19820
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
659 *p = PyString_AS_STRING(uarg);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
660 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
661 #endif
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
662 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
663 return converterr("string or None",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
664 arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
665 if (*format == '#') {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
666 int *q = va_arg(*p_va, int *);
12612
5648df74395f Trent Mick:
Guido van Rossum <guido@python.org>
parents: 12570
diff changeset
667 if (arg == Py_None)
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
668 *q = 0;
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
669 else
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
670 *q = PyString_Size(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
671 format++;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
672 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
673 else if (*p != NULL &&
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
674 (int)strlen(*p) != PyString_Size(arg))
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
675 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
676 "string without null bytes or None",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
677 arg, msgbuf);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
678 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
679 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
680 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
681
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
682 case 'e': {/* encoded string */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
683 char **buffer;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
684 const char *encoding;
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
685 PyObject *s;
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
686 int size, recode_strings;
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
687
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
688 /* Get 'e' parameter: the encoding name */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
689 encoding = (const char *)va_arg(*p_va, const char *);
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
690 #ifdef Py_USING_UNICODE
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
691 if (encoding == NULL)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
692 encoding = PyUnicode_GetDefaultEncoding();
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
693 #endif
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
694
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
695 /* Get output buffer parameter:
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
696 's' (recode all objects via Unicode) or
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
697 't' (only recode non-string objects)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
698 */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
699 if (*format == 's')
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
700 recode_strings = 1;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
701 else if (*format == 't')
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
702 recode_strings = 0;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
703 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
704 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
705 "(unknown parser marker combination)",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
706 arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
707 buffer = (char **)va_arg(*p_va, char **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
708 format++;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
709 if (buffer == NULL)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
710 return converterr("(buffer is NULL)",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
711 arg, msgbuf);
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
712
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
713 /* Encode object */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
714 if (!recode_strings && PyString_Check(arg)) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
715 s = arg;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
716 Py_INCREF(s);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
717 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
718 else {
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
719 #ifdef Py_USING_UNICODE
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
720 PyObject *u;
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
721
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
722 /* Convert object to Unicode */
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
723 u = PyUnicode_FromObject(arg);
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
724 if (u == NULL)
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
725 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
726 "string or unicode or text buffer",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
727 arg, msgbuf);
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
728
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
729 /* Encode object; use default error handling */
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
730 s = PyUnicode_AsEncodedString(u,
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
731 encoding,
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
732 NULL);
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
733 Py_DECREF(u);
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
734 if (s == NULL)
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
735 return converterr("(encoding failed)",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
736 arg, msgbuf);
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
737 if (!PyString_Check(s)) {
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
738 Py_DECREF(s);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
739 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
740 "(encoder failed to return a string)",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
741 arg, msgbuf);
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
742 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
743 #else
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
744 return converterr("string<e>", arg, msgbuf);
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
745 #endif
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
746 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
747 size = PyString_GET_SIZE(s);
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
748
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
749 /* Write output; output is guaranteed to be 0-terminated */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
750 if (*format == '#') {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
751 /* Using buffer length parameter '#':
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
752
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
753 - if *buffer is NULL, a new buffer of the
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
754 needed size is allocated and the data
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
755 copied into it; *buffer is updated to point
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
756 to the new buffer; the caller is
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
757 responsible for PyMem_Free()ing it after
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
758 usage
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
759
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
760 - if *buffer is not NULL, the data is
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
761 copied to *buffer; *buffer_len has to be
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
762 set to the size of the buffer on input;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
763 buffer overflow is signalled with an error;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
764 buffer has to provide enough room for the
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
765 encoded string plus the trailing 0-byte
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
766
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
767 - in both cases, *buffer_len is updated to
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
768 the size of the buffer /excluding/ the
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
769 trailing 0-byte
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
770
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
771 */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
772 int *buffer_len = va_arg(*p_va, int *);
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
773
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
774 format++;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
775 if (buffer_len == NULL)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
776 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
777 "(buffer_len is NULL)",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
778 arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
779 if (*buffer == NULL) {
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
780 *buffer = PyMem_NEW(char, size + 1);
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
781 if (*buffer == NULL) {
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
782 Py_DECREF(s);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
783 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
784 "(memory error)",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
785 arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
786 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
787 } else {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
788 if (size + 1 > *buffer_len) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
789 Py_DECREF(s);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
790 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
791 "(buffer overflow)",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
792 arg, msgbuf);
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
793 }
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
794 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
795 memcpy(*buffer,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
796 PyString_AS_STRING(s),
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
797 size + 1);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
798 *buffer_len = size;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
799 } else {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
800 /* Using a 0-terminated buffer:
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
801
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
802 - the encoded string has to be 0-terminated
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
803 for this variant to work; if it is not, an
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
804 error raised
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
805
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
806 - a new buffer of the needed size is
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
807 allocated and the data copied into it;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
808 *buffer is updated to point to the new
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
809 buffer; the caller is responsible for
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
810 PyMem_Free()ing it after usage
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
811
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
812 */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
813 if ((int)strlen(PyString_AS_STRING(s)) != size)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
814 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
815 "(encoded string without NULL bytes)",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
816 arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
817 *buffer = PyMem_NEW(char, size + 1);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
818 if (*buffer == NULL) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
819 Py_DECREF(s);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
820 return converterr("(memory error)",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
821 arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
822 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
823 memcpy(*buffer,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
824 PyString_AS_STRING(s),
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
825 size + 1);
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
826 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
827 Py_DECREF(s);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
828 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
829 }
12570
3dbe41380266 Brian Hooper <brian_takashi@hotmail.com>:
Fred Drake <fdrake@acm.org>
parents: 12510
diff changeset
830
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
831 #ifdef Py_USING_UNICODE
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
832 case 'u': {/* raw unicode buffer (Py_UNICODE *) */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
833 if (*format == '#') { /* any buffer-like object */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
834 void **p = (void **)va_arg(*p_va, char **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
835 int *q = va_arg(*p_va, int *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
836 char *buf;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
837 int count = convertbuffer(arg, p, &buf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
838
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
839 if (count < 0)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
840 return converterr(buf, arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
841 *q = count/(sizeof(Py_UNICODE));
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
842 format++;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
843 } else {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
844 Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
12570
3dbe41380266 Brian Hooper <brian_takashi@hotmail.com>:
Fred Drake <fdrake@acm.org>
parents: 12510
diff changeset
845
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
846 if (PyUnicode_Check(arg))
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
847 *p = PyUnicode_AS_UNICODE(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
848 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
849 return converterr("unicode", arg, msgbuf);
12570
3dbe41380266 Brian Hooper <brian_takashi@hotmail.com>:
Fred Drake <fdrake@acm.org>
parents: 12510
diff changeset
850 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
851 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
852 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
853 #endif
12570
3dbe41380266 Brian Hooper <brian_takashi@hotmail.com>:
Fred Drake <fdrake@acm.org>
parents: 12510
diff changeset
854
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
855 case 'S': { /* string object */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
856 PyObject **p = va_arg(*p_va, PyObject **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
857 if (PyString_Check(arg))
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
858 *p = arg;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
859 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
860 return converterr("string", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
861 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
862 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
863
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
864 #ifdef Py_USING_UNICODE
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
865 case 'U': { /* Unicode object */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
866 PyObject **p = va_arg(*p_va, PyObject **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
867 if (PyUnicode_Check(arg))
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
868 *p = arg;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
869 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
870 return converterr("unicode", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
871 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
872 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
873 #endif
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
874
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
875 case 'O': { /* object */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
876 PyTypeObject *type;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
877 PyObject **p;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
878 if (*format == '!') {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
879 type = va_arg(*p_va, PyTypeObject*);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
880 p = va_arg(*p_va, PyObject **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
881 format++;
19533
3e7897822459 The "O!" format code should implement an isinstance() test
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
882 if (PyType_IsSubtype(arg->ob_type, type))
11975
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
883 *p = arg;
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
884 else
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
885 return converterr(type->tp_name, arg, msgbuf);
8358
da4bdceeaad7 Another veeeeeery old patch...
Guido van Rossum <guido@python.org>
parents: 7982
diff changeset
886
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
887 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
888 else if (*format == '?') {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
889 inquiry pred = va_arg(*p_va, inquiry);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
890 p = va_arg(*p_va, PyObject **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
891 format++;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
892 if ((*pred)(arg))
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
893 *p = arg;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
894 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
895 return converterr("(unspecified)",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
896 arg, msgbuf);
8358
da4bdceeaad7 Another veeeeeery old patch...
Guido van Rossum <guido@python.org>
parents: 7982
diff changeset
897
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
898 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
899 else if (*format == '&') {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
900 typedef int (*converter)(PyObject *, void *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
901 converter convert = va_arg(*p_va, converter);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
902 void *addr = va_arg(*p_va, void *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
903 format++;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
904 if (! (*convert)(arg, addr))
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
905 return converterr("(unspecified)",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
906 arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
907 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
908 else {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
909 p = va_arg(*p_va, PyObject **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
910 *p = arg;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
911 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
912 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
913 }
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
914
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
915
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
916 case 'w': { /* memory buffer, read-write access */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
917 void **p = va_arg(*p_va, void **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
918 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
919 int count;
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
920
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
921 if (pb == NULL ||
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
922 pb->bf_getwritebuffer == NULL ||
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
923 pb->bf_getsegcount == NULL)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
924 return converterr("read-write buffer", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
925 if ((*pb->bf_getsegcount)(arg, NULL) != 1)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
926 return converterr("single-segment read-write buffer",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
927 arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
928 if ((count = pb->bf_getwritebuffer(arg, 0, p)) < 0)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
929 return converterr("(unspecified)", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
930 if (*format == '#') {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
931 int *q = va_arg(*p_va, int *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
932
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
933 *q = count;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
934 format++;
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
935 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
936 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
937 }
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
938
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
939 case 't': { /* 8-bit character buffer, read-only access */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
940 const char **p = va_arg(*p_va, const char **);
20371
8ef3e95182c3 Undo part of 2.59: 't' case of convertsimple() should not use convertbuffer().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20357
diff changeset
941 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
942 int count;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
943
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
944 if (*format++ != '#')
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
945 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
946 "invalid use of 't' format character",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
947 arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
948 if (!PyType_HasFeature(arg->ob_type,
20371
8ef3e95182c3 Undo part of 2.59: 't' case of convertsimple() should not use convertbuffer().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20357
diff changeset
949 Py_TPFLAGS_HAVE_GETCHARBUFFER) ||
8ef3e95182c3 Undo part of 2.59: 't' case of convertsimple() should not use convertbuffer().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20357
diff changeset
950 pb == NULL || pb->bf_getcharbuffer == NULL ||
8ef3e95182c3 Undo part of 2.59: 't' case of convertsimple() should not use convertbuffer().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20357
diff changeset
951 pb->bf_getsegcount == NULL)
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
952 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
953 "string or read-only character buffer",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
954 arg, msgbuf);
9306
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
955
20371
8ef3e95182c3 Undo part of 2.59: 't' case of convertsimple() should not use convertbuffer().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20357
diff changeset
956 if (pb->bf_getsegcount(arg, NULL) != 1)
8ef3e95182c3 Undo part of 2.59: 't' case of convertsimple() should not use convertbuffer().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20357
diff changeset
957 return converterr(
8ef3e95182c3 Undo part of 2.59: 't' case of convertsimple() should not use convertbuffer().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20357
diff changeset
958 "string or single-segment read-only buffer",
8ef3e95182c3 Undo part of 2.59: 't' case of convertsimple() should not use convertbuffer().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20357
diff changeset
959 arg, msgbuf);
8ef3e95182c3 Undo part of 2.59: 't' case of convertsimple() should not use convertbuffer().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20357
diff changeset
960
8ef3e95182c3 Undo part of 2.59: 't' case of convertsimple() should not use convertbuffer().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20357
diff changeset
961 count = pb->bf_getcharbuffer(arg, 0, p);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
962 if (count < 0)
20371
8ef3e95182c3 Undo part of 2.59: 't' case of convertsimple() should not use convertbuffer().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20357
diff changeset
963 return converterr("(unspecified)", arg, msgbuf);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
964 *va_arg(*p_va, int *) = count;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
965 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
966 }
9306
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
967
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
968 default:
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
969 return converterr("impossible<bad format char>", arg, msgbuf);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
970
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
971 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
972
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
973 *p_format = format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
974 return NULL;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
975 }
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
976
20629
acc7e3b4d042 Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents: 20371
diff changeset
977 static int
acc7e3b4d042 Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents: 20371
diff changeset
978 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
979 {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
980 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
981 int count;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
982 if (pb == NULL ||
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
983 pb->bf_getreadbuffer == NULL ||
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
984 pb->bf_getsegcount == NULL) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
985 *errmsg = "string or read-only buffer";
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
986 return -1;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
987 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
988 if ((*pb->bf_getsegcount)(arg, NULL) != 1) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
989 *errmsg = "string or single-segment read-only buffer";
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
990 return -1;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
991 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
992 if ((count = (*pb->bf_getreadbuffer)(arg, 0, p)) < 0) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
993 *errmsg = "(unspecified)";
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
994 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
995 return count;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
996 }
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
997
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
998 /* 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
999 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
1000
20711
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1001 /* 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
1002 int
acc7e3b4d042 Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents: 20371
diff changeset
1003 PyArg_ParseTupleAndKeywords(PyObject *args,
acc7e3b4d042 Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents: 20371
diff changeset
1004 PyObject *keywords,
acc7e3b4d042 Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents: 20371
diff changeset
1005 char *format,
acc7e3b4d042 Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents: 20371
diff changeset
1006 char **kwlist, ...)
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1007 {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1008 int retval;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1009 va_list va;
20710
a44cc0c21cfe PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents: 20709
diff changeset
1010
a44cc0c21cfe PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents: 20709
diff changeset
1011 if ((args == NULL || !PyTuple_Check(args)) ||
a44cc0c21cfe PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents: 20709
diff changeset
1012 (keywords != NULL && !PyDict_Check(keywords)) ||
a44cc0c21cfe PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents: 20709
diff changeset
1013 format == NULL ||
a44cc0c21cfe PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents: 20709
diff changeset
1014 kwlist == NULL)
a44cc0c21cfe PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents: 20709
diff changeset
1015 {
a44cc0c21cfe PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents: 20709
diff changeset
1016 PyErr_BadInternalCall();
20711
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1017 return 0;
20710
a44cc0c21cfe PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents: 20709
diff changeset
1018 }
a44cc0c21cfe PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents: 20709
diff changeset
1019
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1020 va_start(va, kwlist);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1021 retval = vgetargskeywords(args, keywords, format, kwlist, &va);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1022 va_end(va);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1023 return retval;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1024 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1025
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1027 static int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
1028 vgetargskeywords(PyObject *args, PyObject *keywords, char *format,
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
1029 char **kwlist, va_list *p_va)
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1030 {
20721
acb854b897bb vgetargskeywords: Prevent another potential sprintf buffer overrun.
Tim Peters <tim.peters@gmail.com>
parents: 20720
diff changeset
1031 char msgbuf[512];
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1032 int levels[32];
20711
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1033 char *fname, *message;
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1034 int min, max;
20713
7f4089519926 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20712
diff changeset
1035 char *formatsave;
20722
676f106a5002 vgetargskeywords: Now that it's clear that nkwlist must equal max, and
Tim Peters <tim.peters@gmail.com>
parents: 20721
diff changeset
1036 int i, len, nargs, nkeywords;
20723
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1037 char *msg, **p;
20708
e912b683ed3e vgetargskeywords(): remove test that can't succeed. Not a bugfix, just
Tim Peters <tim.peters@gmail.com>
parents: 20632
diff changeset
1038
20710
a44cc0c21cfe PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents: 20709
diff changeset
1039 assert(args != NULL && PyTuple_Check(args));
a44cc0c21cfe PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents: 20709
diff changeset
1040 assert(keywords == NULL || PyDict_Check(keywords));
a44cc0c21cfe PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents: 20709
diff changeset
1041 assert(format != NULL);
a44cc0c21cfe PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents: 20709
diff changeset
1042 assert(kwlist != NULL);
a44cc0c21cfe PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents: 20709
diff changeset
1043 assert(p_va != NULL);
a44cc0c21cfe PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents: 20709
diff changeset
1044
20711
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1045 /* Search the format:
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1046 message <- error msg, if any (else NULL).
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1047 name <- routine name, if any (else NULL).
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1048 min <- # of required arguments, or -1 if all are required.
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1049 max <- most arguments (required + optional).
20720
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1050 Check that kwlist has a non-NULL entry for each arg.
20711
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1051 Raise error if a tuple arg spec is found.
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1052 */
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1053 fname = message = NULL;
20713
7f4089519926 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20712
diff changeset
1054 formatsave = format;
20720
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1055 p = kwlist;
20711
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1056 min = -1;
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1057 max = 0;
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1058 while ((i = *format++) != '\0') {
20720
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1059 if (isalpha(i) && i != 'e') {
20711
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1060 max++;
20720
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1061 if (*p == NULL) {
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1062 /* kwlist is too short */
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1063 PyErr_BadInternalCall();
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1064 return 0;
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1065 }
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1066 p++;
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1067 }
20711
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1068 else if (i == '|')
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1069 min = max;
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1070 else if (i == ':') {
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1071 fname = format;
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1072 break;
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1073 }
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1074 else if (i == ';') {
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1075 message = format;
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1076 break;
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1077 }
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1078 else if (i == '(') {
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1079 PyErr_SetString(PyExc_SystemError,
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1080 "tuple found in format when using keyword arguments");
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1081 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1082 }
20720
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1083 }
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1084 format = formatsave;
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1085 if (*p != NULL) {
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1086 /* kwlist is too long */
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1087 PyErr_BadInternalCall();
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1088 return 0;
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1089 }
20711
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1090 if (min < 0) {
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1091 /* All arguments are required. */
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1092 min = max;
20711
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1093 }
2890769b1e69 PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents: 20710
diff changeset
1094
20713
7f4089519926 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20712
diff changeset
1095 nargs = PyTuple_GET_SIZE(args);
20714
091f9656d79b vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20713
diff changeset
1096 nkeywords = keywords == NULL ? 0 : PyDict_Size(keywords);
20708
e912b683ed3e vgetargskeywords(): remove test that can't succeed. Not a bugfix, just
Tim Peters <tim.peters@gmail.com>
parents: 20632
diff changeset
1097
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1098 /* make sure there are no duplicate values for an argument;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1099 its not clear when to use the term "keyword argument vs.
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1100 keyword parameter in messages */
20715
5e6f8187bd48 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20714
diff changeset
1101 if (nkeywords > 0) {
20713
7f4089519926 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20712
diff changeset
1102 for (i = 0; i < nargs; i++) {
20709
310450e74f2f tuple(3,4,5,x=2) dumped core on my box. vgetargskeywords() overindexed
Tim Peters <tim.peters@gmail.com>
parents: 20708
diff changeset
1103 char *thiskw = kwlist[i];
310450e74f2f tuple(3,4,5,x=2) dumped core on my box. vgetargskeywords() overindexed
Tim Peters <tim.peters@gmail.com>
parents: 20708
diff changeset
1104 if (thiskw == NULL)
310450e74f2f tuple(3,4,5,x=2) dumped core on my box. vgetargskeywords() overindexed
Tim Peters <tim.peters@gmail.com>
parents: 20708
diff changeset
1105 break;
20717
84715d52d954 vgetargskeywords: The keywords arg is a dict (if non-NULL), so use the
Tim Peters <tim.peters@gmail.com>
parents: 20716
diff changeset
1106 if (PyDict_GetItemString(keywords, thiskw)) {
20715
5e6f8187bd48 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20714
diff changeset
1107 PyErr_Format(PyExc_TypeError,
5e6f8187bd48 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20714
diff changeset
1108 "keyword parameter '%s' was given "
5e6f8187bd48 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20714
diff changeset
1109 "by position and by name",
20709
310450e74f2f tuple(3,4,5,x=2) dumped core on my box. vgetargskeywords() overindexed
Tim Peters <tim.peters@gmail.com>
parents: 20708
diff changeset
1110 thiskw);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1111 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1112 }
20718
c6384591d846 vgetargskeywords: Removed all PyErr_Clear() calls. It's possible that
Tim Peters <tim.peters@gmail.com>
parents: 20717
diff changeset
1113 else if (PyErr_Occurred())
c6384591d846 vgetargskeywords: Removed all PyErr_Clear() calls. It's possible that
Tim Peters <tim.peters@gmail.com>
parents: 20717
diff changeset
1114 return 0;
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1115 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1116 }
20716
dcf769c12d8b vgetargskeywords: Removed one of the mysterious PyErr_Clear() calls.
Tim Peters <tim.peters@gmail.com>
parents: 20715
diff changeset
1117
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1118 /* required arguments missing from args can be supplied by keyword
20720
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1119 arguments; set len to the number of posiitional arguments, and,
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1120 if that's less than the minimum required, add in the number of
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1121 required arguments that are supplied by keywords */
20713
7f4089519926 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20712
diff changeset
1122 len = nargs;
20720
aaefc2f21bae vgetargskeywords: Verify kwlist has the required length while parsing
Tim Peters <tim.peters@gmail.com>
parents: 20718
diff changeset
1123 if (nkeywords > 0 && nargs < min) {
20713
7f4089519926 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20712
diff changeset
1124 for (i = nargs; i < min; i++) {
20717
84715d52d954 vgetargskeywords: The keywords arg is a dict (if non-NULL), so use the
Tim Peters <tim.peters@gmail.com>
parents: 20716
diff changeset
1125 if (PyDict_GetItemString(keywords, kwlist[i]))
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1126 len++;
20718
c6384591d846 vgetargskeywords: Removed all PyErr_Clear() calls. It's possible that
Tim Peters <tim.peters@gmail.com>
parents: 20717
diff changeset
1127 else if (PyErr_Occurred())
c6384591d846 vgetargskeywords: Removed all PyErr_Clear() calls. It's possible that
Tim Peters <tim.peters@gmail.com>
parents: 20717
diff changeset
1128 return 0;
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1129 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1130 }
20718
c6384591d846 vgetargskeywords: Removed all PyErr_Clear() calls. It's possible that
Tim Peters <tim.peters@gmail.com>
parents: 20717
diff changeset
1131
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1132 /* make sure we got an acceptable number of arguments; the message
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1133 is a little confusing with keywords since keyword arguments
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1134 which are supplied, but don't match the required arguments
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1135 are not included in the "%d given" part of the message */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1136 if (len < min || max < len) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1137 if (message == NULL) {
21074
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
1138 PyOS_snprintf(msgbuf, sizeof(msgbuf),
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
1139 "%.200s%s takes %s %d argument%s "
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
1140 "(%d given)",
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
1141 fname==NULL ? "function" : fname,
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
1142 fname==NULL ? "" : "()",
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
1143 min==max ? "exactly"
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
1144 : len < min ? "at least" : "at most",
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
1145 len < min ? min : max,
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
1146 (len < min ? min : max) == 1 ? "" : "s",
47ea73fd7e6b Use PyOS_snprintf when possible.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
1147 len);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1148 message = msgbuf;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1149 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1150 PyErr_SetString(PyExc_TypeError, message);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1151 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1152 }
20723
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1153
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1154 /* convert the positional arguments */
20713
7f4089519926 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20712
diff changeset
1155 for (i = 0; i < nargs; i++) {
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1156 if (*format == '|')
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1157 format++;
17856
2807949e0ba5 vgetargs1() and vgetargskeywords(): Replace uses of PyTuple_Size() and
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17817
diff changeset
1158 msg = convertitem(PyTuple_GET_ITEM(args, i), &format, p_va,
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1159 levels, msgbuf);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1160 if (msg) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1161 seterror(i+1, msg, levels, fname, message);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1162 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1163 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1164 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1165
20723
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1166 /* handle no keyword parameters in call */
20715
5e6f8187bd48 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20714
diff changeset
1167 if (nkeywords == 0)
20712
a6a4bd2f06d0 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20711
diff changeset
1168 return 1;
20715
5e6f8187bd48 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20714
diff changeset
1169
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1170 /* convert the keyword arguments; this uses the format
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1171 string where it was left after processing args */
20722
676f106a5002 vgetargskeywords: Now that it's clear that nkwlist must equal max, and
Tim Peters <tim.peters@gmail.com>
parents: 20721
diff changeset
1172 for (i = nargs; i < max; i++) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1173 PyObject *item;
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1174 if (*format == '|')
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1175 format++;
20717
84715d52d954 vgetargskeywords: The keywords arg is a dict (if non-NULL), so use the
Tim Peters <tim.peters@gmail.com>
parents: 20716
diff changeset
1176 item = PyDict_GetItemString(keywords, kwlist[i]);
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1177 if (item != NULL) {
20717
84715d52d954 vgetargskeywords: The keywords arg is a dict (if non-NULL), so use the
Tim Peters <tim.peters@gmail.com>
parents: 20716
diff changeset
1178 Py_INCREF(item);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1179 msg = convertitem(item, &format, p_va, levels, msgbuf);
20717
84715d52d954 vgetargskeywords: The keywords arg is a dict (if non-NULL), so use the
Tim Peters <tim.peters@gmail.com>
parents: 20716
diff changeset
1180 Py_DECREF(item);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1181 if (msg) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1182 seterror(i+1, msg, levels, fname, message);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1183 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1184 }
20723
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1185 --nkeywords;
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1186 if (nkeywords == 0)
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1187 break;
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1188 }
20718
c6384591d846 vgetargskeywords: Removed all PyErr_Clear() calls. It's possible that
Tim Peters <tim.peters@gmail.com>
parents: 20717
diff changeset
1189 else if (PyErr_Occurred())
c6384591d846 vgetargskeywords: Removed all PyErr_Clear() calls. It's possible that
Tim Peters <tim.peters@gmail.com>
parents: 20717
diff changeset
1190 return 0;
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1191 else {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1192 msg = skipitem(&format, p_va);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1193 if (msg) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1194 seterror(i+1, msg, levels, fname, message);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1195 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1196 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1197 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1198 }
20715
5e6f8187bd48 vgetargskeywords:
Tim Peters <tim.peters@gmail.com>
parents: 20714
diff changeset
1199
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1200 /* make sure there are no extraneous keyword arguments */
20723
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1201 if (nkeywords > 0) {
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1202 PyObject *key, *value;
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1203 int pos = 0;
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1204 while (PyDict_Next(keywords, &pos, &key, &value)) {
20723
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1205 int match = 0;
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1206 char *ks = PyString_AsString(key);
20722
676f106a5002 vgetargskeywords: Now that it's clear that nkwlist must equal max, and
Tim Peters <tim.peters@gmail.com>
parents: 20721
diff changeset
1207 for (i = 0; i < max; i++) {
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1208 if (!strcmp(ks, kwlist[i])) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1209 match = 1;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1210 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1211 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1212 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1213 if (!match) {
20723
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1214 PyErr_Format(PyExc_TypeError,
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1215 "'%s' is an invalid keyword "
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1216 "argument for this function",
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1217 ks);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1218 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1219 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1220 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1221 }
20723
6ac45244c41e vgetargskeywords()
Tim Peters <tim.peters@gmail.com>
parents: 20722
diff changeset
1222
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1223 return 1;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1224 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1225
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1226
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1227 static char *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
1228 skipitem(char **p_format, va_list *p_va)
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1229 {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1230 char *format = *p_format;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1231 char c = *format++;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1232
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1233 switch (c) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1234
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1235 case 'b': /* byte -- very short int */
13872
35fc9511a36f Changed H specifier to mean "bitfield", i.e. any value from
Jack Jansen <jack.jansen@cwi.nl>
parents: 13837
diff changeset
1236 case 'B': /* byte as bitfield */
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1237 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1238 (void) va_arg(*p_va, char *);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1239 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1240 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1241
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1242 case 'h': /* short int */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1243 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1244 (void) va_arg(*p_va, short *);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1245 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1246 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1247
13872
35fc9511a36f Changed H specifier to mean "bitfield", i.e. any value from
Jack Jansen <jack.jansen@cwi.nl>
parents: 13837
diff changeset
1248 case 'H': /* short int as bitfield */
13378
113d833eea7e Added support for H (unsigned short) specifier in PyArg_ParseTuple and
Jack Jansen <jack.jansen@cwi.nl>
parents: 13268
diff changeset
1249 {
113d833eea7e Added support for H (unsigned short) specifier in PyArg_ParseTuple and
Jack Jansen <jack.jansen@cwi.nl>
parents: 13268
diff changeset
1250 (void) va_arg(*p_va, unsigned short *);
113d833eea7e Added support for H (unsigned short) specifier in PyArg_ParseTuple and
Jack Jansen <jack.jansen@cwi.nl>
parents: 13268
diff changeset
1251 break;
113d833eea7e Added support for H (unsigned short) specifier in PyArg_ParseTuple and
Jack Jansen <jack.jansen@cwi.nl>
parents: 13268
diff changeset
1252 }
113d833eea7e Added support for H (unsigned short) specifier in PyArg_ParseTuple and
Jack Jansen <jack.jansen@cwi.nl>
parents: 13268
diff changeset
1253
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1254 case 'i': /* int */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1255 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1256 (void) va_arg(*p_va, int *);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1257 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1258 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1259
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1260 case 'l': /* long int */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1261 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1262 (void) va_arg(*p_va, long *);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1263 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1264 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1265
9949
98e37347378b Change rare occurrences of #if HAVE_LONG_LONG to #ifdef.
Guido van Rossum <guido@python.org>
parents: 9306
diff changeset
1266 #ifdef HAVE_LONG_LONG
9044
d437b6683e24 Patch by Mark Hammond to support 64-bit ints on MS platforms.
Guido van Rossum <guido@python.org>
parents: 8822
diff changeset
1267 case 'L': /* LONG_LONG int */
8822
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
1268 {
9044
d437b6683e24 Patch by Mark Hammond to support 64-bit ints on MS platforms.
Guido van Rossum <guido@python.org>
parents: 8822
diff changeset
1269 (void) va_arg(*p_va, LONG_LONG *);
8822
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
1270 break;
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
1271 }
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
1272 #endif
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
1273
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1274 case 'f': /* float */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1275 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1276 (void) va_arg(*p_va, float *);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1277 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1278 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1279
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1280 case 'd': /* double */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1281 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1282 (void) va_arg(*p_va, double *);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1283 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1284 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1285
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1286 #ifndef WITHOUT_COMPLEX
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1287 case 'D': /* complex double */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1288 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1289 (void) va_arg(*p_va, Py_complex *);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1290 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1291 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1292 #endif /* WITHOUT_COMPLEX */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1293
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1294 case 'c': /* char */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1295 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1296 (void) va_arg(*p_va, char *);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1297 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1298 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1299
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1300 case 's': /* string */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1301 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1302 (void) va_arg(*p_va, char **);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1303 if (*format == '#') {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1304 (void) va_arg(*p_va, int *);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1305 format++;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1306 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1307 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1308 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1309
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1310 case 'z': /* string */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1311 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1312 (void) va_arg(*p_va, char **);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1313 if (*format == '#') {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1314 (void) va_arg(*p_va, int *);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1315 format++;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1316 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1317 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1318 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1319
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1320 case 'S': /* string object */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1321 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1322 (void) va_arg(*p_va, PyObject **);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1323 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1324 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1325
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1326 case 'O': /* object */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1327 {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1328 if (*format == '!') {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1329 format++;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1330 (void) va_arg(*p_va, PyTypeObject*);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1331 (void) va_arg(*p_va, PyObject **);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1332 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1333 #if 0
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1334 /* I don't know what this is for */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1335 else if (*format == '?') {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1336 inquiry pred = va_arg(*p_va, inquiry);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1337 format++;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1338 if ((*pred)(arg)) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1339 (void) va_arg(*p_va, PyObject **);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1340 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1341 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1342 #endif
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1343 else if (*format == '&') {
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13378
diff changeset
1344 typedef int (*converter)(PyObject *, void *);
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1345 (void) va_arg(*p_va, converter);
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1346 (void) va_arg(*p_va, void *);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1347 format++;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1348 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1349 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1350 (void) va_arg(*p_va, PyObject **);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1351 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1352 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1353 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1354
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1355 default:
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1356 return "impossible<bad format char>";
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1357
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1358 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1359
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1360 *p_format = format;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1361 return NULL;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1362 }
20632
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1363
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1364
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1365 int
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1366 PyArg_UnpackTuple(PyObject *args, char *name, int min, int max, ...)
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1367 {
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1368 int i, l;
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1369 PyObject **o;
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1370 va_list vargs;
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1371
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1372 #ifdef HAVE_STDARG_PROTOTYPES
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1373 va_start(vargs, max);
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1374 #else
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1375 va_start(vargs);
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1376 #endif
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1377
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1378 assert(min >= 0);
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1379 assert(min <= max);
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1380 if (!PyTuple_Check(args)) {
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1381 PyErr_SetString(PyExc_SystemError,
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1382 "PyArg_UnpackTuple() argument list is not a tuple");
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1383 return 0;
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1384 }
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1385 l = PyTuple_GET_SIZE(args);
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1386 if (l < min) {
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1387 if (name != NULL)
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1388 PyErr_Format(
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1389 PyExc_TypeError,
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1390 "%s expected %s%d arguments, got %d",
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1391 name, (min == max ? "" : "at least "), min, l);
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1392 else
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1393 PyErr_Format(
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1394 PyExc_TypeError,
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1395 "unpacked tuple should have %s%d elements,"
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1396 " but has %d",
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1397 (min == max ? "" : "at least "), min, l);
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1398 va_end(vargs);
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1399 return 0;
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1400 }
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1401 if (l > max) {
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1402 if (name != NULL)
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1403 PyErr_Format(
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1404 PyExc_TypeError,
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1405 "%s expected %s%d arguments, got %d",
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1406 name, (min == max ? "" : "at most "), max, l);
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1407 else
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1408 PyErr_Format(
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1409 PyExc_TypeError,
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1410 "unpacked tuple should have %s%d elements,"
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1411 " but has %d",
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1412 (min == max ? "" : "at most "), max, l);
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1413 va_end(vargs);
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1414 return 0;
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1415 }
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1416 for (i = 0; i < l; i++) {
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1417 o = va_arg(vargs, PyObject **);
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1418 *o = PyTuple_GET_ITEM(args, i);
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1419 }
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1420 va_end(vargs);
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1421 return 1;
6c84d55abb58 PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents: 20629
diff changeset
1422 }