annotate Python/getargs.c @ 19826:8ef456949b76 legacy-trunk

Improve threading on Solaris, according to SF patch #460269, submitted by bbrox@bbrox.org / lionel.ulmer@free.fr. This adds a configure check and if all goes well turns on the PTHREAD_SCOPE_SYSTEM thread attribute for new threads. This should remove the need to add tiny sleeps at the start of threads to allow other threads to be scheduled.
author Guido van Rossum <guido@python.org>
date Mon, 10 Sep 2001 14:10:54 +0000
parents fe5ec1a3a7e0
children c0d662966272
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
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 /* XXX There are several unchecked sprintf or strcat calls in this file.
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 XXX The only way these can become a danger is if some C code in the
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 XXX Python source (or in an extension) uses ridiculously long names
13620
5b727ab37092 Spelling fixes supplied by Rob W. W. Hooft. All these are fixes in either
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
7 XXX or ridiculously deep nesting in format strings. */
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
8
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
9 #include "Python.h"
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
10
4102
9569664ac347 Add needed #include <ctype.h>
Guido van Rossum <guido@python.org>
parents: 4026
diff changeset
11 #include <ctype.h>
9569664ac347 Add needed #include <ctype.h>
Guido van Rossum <guido@python.org>
parents: 4026
diff changeset
12
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
13
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13378
diff changeset
14 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
15 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
16 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
17
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13378
diff changeset
18 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
19 char *, char **, ...);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
20
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 /* Forward */
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13378
diff changeset
22 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
23 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
24 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
25 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
26 int *, char *, int);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13378
diff changeset
27 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
28 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
29
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13378
diff changeset
30 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
31 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
32 static char *skipitem(char **, va_list *);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
33
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
34 int PyArg_Parse(PyObject *args, char *format, ...)
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 int retval;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 va_list va;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
38
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 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
40 retval = vgetargs1(args, format, &va, 1);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 va_end(va);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 return retval;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 }
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
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
46 int PyArg_ParseTuple(PyObject *args, char *format, ...)
1913
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 int retval;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 va_list va;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
50
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 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
52 retval = vgetargs1(args, format, &va, 0);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 va_end(va);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 return retval;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
56
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
57
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
59 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
60 {
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
61 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
62
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
63 #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
64 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
65 #else
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
66 lva = va;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
67 #endif
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
68
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
69 return vgetargs1(args, format, &lva, 0);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
71
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 static int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
74 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
75 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 char msgbuf[256];
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 int levels[32];
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 char *fname = NULL;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 char *message = NULL;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 int min = -1;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 int max = 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
82 int level = 0;
17997
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
83 int endfmt = 0;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 char *formatsave = format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 int i, len;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 char *msg;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
87
16582
9a8e961b505f Related to SF bug 132008 (PyList_Reverse blows up).
Tim Peters <tim.peters@gmail.com>
parents: 16264
diff changeset
88 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
89
17997
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
90 while (endfmt == 0) {
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 int c = *format++;
17997
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
92 switch (c) {
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
93 case '(':
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
94 if (level == 0)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
95 max++;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 level++;
17997
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
97 break;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
98 case ')':
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 if (level == 0)
17997
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
100 Py_FatalError("excess ')' in getargs format");
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 else
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 level--;
17997
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 '\0':
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
105 endfmt = 1;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
106 break;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
107 case ':':
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
108 fname = format;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
109 endfmt = 1;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
110 break;
17997
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
111 case ';':
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
112 message = format;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
113 endfmt = 1;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
114 break;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
115 default:
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
116 if (level == 0) {
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
117 if (c == 'O')
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 (isalpha(c)) {
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
120 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
121 max++;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
122 } else if (c == '|')
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
123 min = max;
27f2422ea335 Change cascaded if stmts to switch stmt in vgetargs1().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17996
diff changeset
124 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
125 break;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
126 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 }
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 (level != 0)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
130 Py_FatalError(/* '(' */ "missing ')' in getargs format");
1913
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 if (min < 0)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
133 min = max;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
134
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
135 format = formatsave;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
136
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
137 if (compat) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
138 if (max == 0) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
139 if (args == NULL)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
140 return 1;
15899
152814f6cd11 This patch makes sure that the function name always appears in the error
Ka-Ping Yee <ping@zesty.ca>
parents: 15502
diff changeset
141 sprintf(msgbuf, "%s%s takes no arguments",
152814f6cd11 This patch makes sure that the function name always appears in the error
Ka-Ping Yee <ping@zesty.ca>
parents: 15502
diff changeset
142 fname==NULL ? "function" : fname,
152814f6cd11 This patch makes sure that the function name always appears in the error
Ka-Ping Yee <ping@zesty.ca>
parents: 15502
diff changeset
143 fname==NULL ? "" : "()");
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
144 PyErr_SetString(PyExc_TypeError, msgbuf);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 return 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
146 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
147 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
148 if (args == NULL) {
7f8719a36662 prevent core dump for old getargs() with NULL arg
Guido van Rossum <guido@python.org>
parents: 1913
diff changeset
149 sprintf(msgbuf,
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
150 "%s%s takes at least one 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
151 fname==NULL ? "function" : fname,
152814f6cd11 This patch makes sure that the function name always appears in the error
Ka-Ping Yee <ping@zesty.ca>
parents: 15502
diff changeset
152 fname==NULL ? "" : "()");
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
153 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
154 return 0;
7f8719a36662 prevent core dump for old getargs() with NULL arg
Guido van Rossum <guido@python.org>
parents: 1913
diff changeset
155 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
156 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
157 if (msg == NULL)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
158 return 1;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
159 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
160 return 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
161 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
162 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
163 PyErr_SetString(PyExc_SystemError,
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
164 "old style getargs format uses new features");
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
165 return 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
166 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
167 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
168
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
169 if (!PyTuple_Check(args)) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
170 PyErr_SetString(PyExc_SystemError,
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
171 "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
172 return 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
173 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
174
17856
2807949e0ba5 vgetargs1() and vgetargskeywords(): Replace uses of PyTuple_Size() and
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17817
diff changeset
175 len = PyTuple_GET_SIZE(args);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
176
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
177 if (len < min || max < len) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
178 if (message == NULL) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
179 sprintf(msgbuf,
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
180 "%s%s takes %s %d argument%s (%d given)",
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
181 fname==NULL ? "function" : fname,
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
182 fname==NULL ? "" : "()",
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
183 min==max ? "exactly"
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
184 : len < min ? "at least" : "at most",
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
185 len < min ? min : max,
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
186 (len < min ? min : max) == 1 ? "" : "s",
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
187 len);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
188 message = msgbuf;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
189 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
190 PyErr_SetString(PyExc_TypeError, message);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
191 return 0;
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
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
194 for (i = 0; i < len; i++) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
195 if (*format == '|')
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
196 format++;
17856
2807949e0ba5 vgetargs1() and vgetargskeywords(): Replace uses of PyTuple_Size() and
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17817
diff changeset
197 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
198 levels, msgbuf);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
199 if (msg) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
200 seterror(i+1, msg, levels, fname, message);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
201 return 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
202 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
203 }
6805
93e480dedcf0 Add explicit check for correct next character in format at end of
Guido van Rossum <guido@python.org>
parents: 5410
diff changeset
204
7982
a909a2869ac5 Make new gcc -Wall happy
Guido van Rossum <guido@python.org>
parents: 7120
diff changeset
205 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
206 *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
207 *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
208 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
209 "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
210 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
211 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
212
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
213 return 1;
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
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
218 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
219 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
220 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
221 char buf[256];
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
222 int i;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 char *p = buf;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
224
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
225 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
226 return;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
227 else if (message == NULL) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
228 if (fname != NULL) {
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
229 sprintf(p, "%s() ", 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);
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
236 while (levels[i] > 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
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 }
152814f6cd11 This patch makes sure that the function name always appears in the error
Ka-Ping Yee <ping@zesty.ca>
parents: 15502
diff changeset
246 sprintf(p, " %s", 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;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
300 sprintf(msgbuf,
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
301 toplevel ? "expected %d arguments, not %s" :
152814f6cd11 This patch makes sure that the function name always appears in the error
Ka-Ping Yee <ping@zesty.ca>
parents: 15502
diff changeset
302 "must be %d-item sequence, not %s",
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
303 n, 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
304 return msgbuf;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
305 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
306
13576
61e4c29d53d8 replace PyXXX_Length calls with PyXXX_Size calls
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 13447
diff changeset
307 if ((i = PySequence_Size(arg)) != n) {
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
308 levels[0] = 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
309 sprintf(msgbuf,
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
310 toplevel ? "expected %d arguments, not %d" :
152814f6cd11 This patch makes sure that the function name always appears in the error
Ka-Ping Yee <ping@zesty.ca>
parents: 15502
diff changeset
311 "must be sequence of length %d, not %d",
152814f6cd11 This patch makes sure that the function name always appears in the error
Ka-Ping Yee <ping@zesty.ca>
parents: 15502
diff changeset
312 n, i);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
313 return msgbuf;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
314 }
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
315
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
316 format = *p_format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
317 for (i = 0; i < n; i++) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
318 char *msg;
10220
0ef1071cb7fe Patch by Tommy Burnette to accept an arbitrary sequence when "(...)"
Guido van Rossum <guido@python.org>
parents: 9949
diff changeset
319 PyObject *item;
0ef1071cb7fe Patch by Tommy Burnette to accept an arbitrary sequence when "(...)"
Guido van Rossum <guido@python.org>
parents: 9949
diff changeset
320 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
321 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
322 /* 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
323 Py_XDECREF(item);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
324 if (msg != NULL) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
325 levels[0] = i+1;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
326 return msg;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
327 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
328 }
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
329
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
330 *p_format = format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
331 return NULL;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
332 }
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 /* Convert a single item. */
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
336
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
337 static char *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
338 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
339 char *msgbuf)
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
340 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
341 char *msg;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
342 char *format = *p_format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
343
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
344 if (*format == '(' /* ')' */) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
345 format++;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
346 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
347 if (msg == NULL)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
348 format++;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
349 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
350 else {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
351 msg = convertsimple(arg, &format, p_va, msgbuf);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
352 if (msg != NULL)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
353 levels[0] = 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
354 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
355 if (msg == NULL)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
356 *p_format = format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
357 return msg;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
358 }
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
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
362 #define UNICODE_DEFAULT_ENCODING(arg) \
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
363 _PyUnicode_AsDefaultEncodedString(arg, NULL)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
364
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
365 /* 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
366
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
367 static char *
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
368 converterr(char *expected, PyObject *arg, char *msgbuf)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
369 {
19820
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
370 assert(expected != NULL);
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
371 assert(arg != NULL);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
372 sprintf(msgbuf, "must be %.50s, not %.50s", expected,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
373 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
374 return msgbuf;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
375 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
376
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
377 #define CONV_UNICODE "(unicode conversion error)"
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 /* 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
380 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
381 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
382 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
383 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
384 */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
385
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
386 static char *
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
387 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
388 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
389 char *format = *p_format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
390 char c = *format++;
19820
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
391 PyObject *uarg;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
392
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
393 switch (c) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
394
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
395 case 'b': { /* unsigned byte -- very short int */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
396 char *p = va_arg(*p_va, char *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
397 long ival = PyInt_AsLong(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
398 if (ival == -1 && PyErr_Occurred())
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
399 return converterr("integer<b>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
400 else if (ival < 0) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
401 PyErr_SetString(PyExc_OverflowError,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
402 "unsigned byte integer is less than minimum");
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
403 return converterr("integer<b>", arg, msgbuf);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
404 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
405 else if (ival > UCHAR_MAX) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
406 PyErr_SetString(PyExc_OverflowError,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
407 "unsigned byte integer is greater than maximum");
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
408 return converterr("integer<b>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
409 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
410 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
411 *p = (unsigned char) ival;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
412 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
413 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
414
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
415 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
416 values allowed */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
417 char *p = va_arg(*p_va, char *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
418 long ival = PyInt_AsLong(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
419 if (ival == -1 && PyErr_Occurred())
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
420 return converterr("integer<b>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
421 else if (ival < SCHAR_MIN) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
422 PyErr_SetString(PyExc_OverflowError,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
423 "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
424 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
425 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
426 else if (ival > (int)UCHAR_MAX) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
427 PyErr_SetString(PyExc_OverflowError,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
428 "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
429 return converterr("integer<B>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
430 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
431 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
432 *p = (unsigned char) ival;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
433 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
434 }
13872
35fc9511a36f Changed H specifier to mean "bitfield", i.e. any value from
Jack Jansen <jack.jansen@cwi.nl>
parents: 13837
diff changeset
435
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
436 case 'h': {/* signed short int */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
437 short *p = va_arg(*p_va, short *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
438 long ival = PyInt_AsLong(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
439 if (ival == -1 && PyErr_Occurred())
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
440 return converterr("integer<h>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
441 else if (ival < SHRT_MIN) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
442 PyErr_SetString(PyExc_OverflowError,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
443 "signed short integer is less than minimum");
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
444 return converterr("integer<h>", arg, msgbuf);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
445 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
446 else if (ival > SHRT_MAX) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
447 PyErr_SetString(PyExc_OverflowError,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
448 "signed short integer is greater than maximum");
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
449 return converterr("integer<h>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
450 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
451 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
452 *p = (short) ival;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
453 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
454 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
455
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
456 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
457 unsigned allowed */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
458 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
459 long ival = PyInt_AsLong(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
460 if (ival == -1 && PyErr_Occurred())
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
461 return converterr("integer<H>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
462 else if (ival < SHRT_MIN) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
463 PyErr_SetString(PyExc_OverflowError,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
464 "short integer bitfield is less than minimum");
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
465 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
466 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
467 else if (ival > USHRT_MAX) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
468 PyErr_SetString(PyExc_OverflowError,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
469 "short integer bitfield is greater than maximum");
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
470 return converterr("integer<H>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
471 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
472 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
473 *p = (unsigned short) ival;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
474 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
475 }
13378
113d833eea7e Added support for H (unsigned short) specifier in PyArg_ParseTuple and
Jack Jansen <jack.jansen@cwi.nl>
parents: 13268
diff changeset
476
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
477 case 'i': {/* signed int */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
478 int *p = va_arg(*p_va, int *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
479 long ival = PyInt_AsLong(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
480 if (ival == -1 && PyErr_Occurred())
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
481 return converterr("integer<i>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
482 else if (ival > INT_MAX) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
483 PyErr_SetString(PyExc_OverflowError,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
484 "signed integer is greater than maximum");
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
485 return converterr("integer<i>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
486 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
487 else if (ival < INT_MIN) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
488 PyErr_SetString(PyExc_OverflowError,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
489 "signed integer is less than minimum");
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
490 return converterr("integer<i>", arg, msgbuf);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
491 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
492 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
493 *p = ival;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
494 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
495 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
496
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
497 case 'l': {/* long int */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
498 long *p = va_arg(*p_va, long *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
499 long ival = PyInt_AsLong(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
500 if (ival == -1 && PyErr_Occurred())
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
501 return converterr("integer<l>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
502 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
503 *p = ival;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
504 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
505 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
506
9949
98e37347378b Change rare occurrences of #if HAVE_LONG_LONG to #ifdef.
Guido van Rossum <guido@python.org>
parents: 9306
diff changeset
507 #ifdef HAVE_LONG_LONG
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
508 case 'L': {/* LONG_LONG */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
509 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
510 LONG_LONG ival = PyLong_AsLongLong( arg );
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
511 if( ival == (LONG_LONG)-1 && PyErr_Occurred() ) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
512 return converterr("long<L>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
513 } else {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
514 *p = ival;
8822
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
515 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
516 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
517 }
8822
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
518 #endif
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
519
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
520 case 'f': {/* float */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
521 float *p = va_arg(*p_va, float *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
522 double dval = PyFloat_AsDouble(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
523 if (PyErr_Occurred())
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
524 return converterr("float<f>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
525 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
526 *p = (float) dval;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
527 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
528 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
529
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
530 case 'd': {/* double */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
531 double *p = va_arg(*p_va, double *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
532 double dval = PyFloat_AsDouble(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
533 if (PyErr_Occurred())
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
534 return converterr("float<d>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
535 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
536 *p = dval;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
537 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
538 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
539
3766
516490c8192c Py_complex; and WITHOUT_COMPLEX added to getargs.c
Guido van Rossum <guido@python.org>
parents: 3323
diff changeset
540 #ifndef WITHOUT_COMPLEX
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
541 case 'D': {/* complex double */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
542 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
543 Py_complex cval;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
544 cval = PyComplex_AsCComplex(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
545 if (PyErr_Occurred())
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
546 return converterr("complex<D>", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
547 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
548 *p = cval;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
549 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
550 }
3766
516490c8192c Py_complex; and WITHOUT_COMPLEX added to getargs.c
Guido van Rossum <guido@python.org>
parents: 3323
diff changeset
551 #endif /* WITHOUT_COMPLEX */
3323
6098aaa8ae7f changes for complex numbers
Guido van Rossum <guido@python.org>
parents: 2210
diff changeset
552
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
553 case 'c': {/* char */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
554 char *p = va_arg(*p_va, char *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
555 if (PyString_Check(arg) && PyString_Size(arg) == 1)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
556 *p = PyString_AsString(arg)[0];
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
557 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
558 return converterr("char", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
559 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
560 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
561
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
562 case 's': {/* string */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
563 if (*format == '#') {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
564 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
565 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
566
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
567 if (PyString_Check(arg)) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
568 *p = PyString_AS_STRING(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
569 *q = PyString_GET_SIZE(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
570 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
571 #ifdef Py_USING_UNICODE
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
572 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
573 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
574 if (uarg == NULL)
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
575 return converterr(CONV_UNICODE,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
576 arg, msgbuf);
19820
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
577 *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
578 *q = PyString_GET_SIZE(uarg);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
579 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
580 #endif
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
581 else { /* any buffer-like object */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
582 char *buf;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
583 int count = convertbuffer(arg, p, &buf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
584 if (count < 0)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
585 return converterr(buf, arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
586 *q = count;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
587 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
588 format++;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
589 } else {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
590 char **p = va_arg(*p_va, char **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
591
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
592 if (PyString_Check(arg))
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
593 *p = PyString_AS_STRING(arg);
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
594 #ifdef Py_USING_UNICODE
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
595 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
596 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
597 if (uarg == NULL)
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
598 return converterr(CONV_UNICODE,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
599 arg, msgbuf);
19820
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
600 *p = PyString_AS_STRING(uarg);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
601 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
602 #endif
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
603 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
604 return converterr("string", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
605 if ((int)strlen(*p) != PyString_Size(arg))
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
606 return converterr("string without null bytes",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
607 arg, msgbuf);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
608 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
609 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
610 }
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
611
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
612 case 'z': {/* string, may be NULL (None) */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
613 if (*format == '#') { /* any buffer-like object */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
614 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
615 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
616
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
617 if (arg == Py_None) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
618 *p = 0;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
619 *q = 0;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
620 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
621 else if (PyString_Check(arg)) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
622 *p = PyString_AS_STRING(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
623 *q = PyString_GET_SIZE(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
624 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
625 #ifdef Py_USING_UNICODE
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
626 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
627 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
628 if (uarg == NULL)
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
629 return converterr(CONV_UNICODE,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
630 arg, msgbuf);
19820
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
631 *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
632 *q = PyString_GET_SIZE(uarg);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
633 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
634 #endif
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
635 else { /* any buffer-like object */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
636 char *buf;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
637 int count = convertbuffer(arg, p, &buf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
638
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
639 if (count < 0)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
640 return converterr(buf, arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
641 *q = count;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
642 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
643 format++;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
644 } else {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
645 char **p = va_arg(*p_va, char **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
646
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
647 if (arg == Py_None)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
648 *p = 0;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
649 else if (PyString_Check(arg))
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
650 *p = PyString_AsString(arg);
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
651 #ifdef Py_USING_UNICODE
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
652 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
653 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
654 if (uarg == NULL)
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
655 return converterr(CONV_UNICODE,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
656 arg, msgbuf);
19820
fe5ec1a3a7e0 Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19533
diff changeset
657 *p = PyString_AS_STRING(uarg);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
658 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
659 #endif
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
660 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
661 return converterr("string or None",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
662 arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
663 if (*format == '#') {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
664 int *q = va_arg(*p_va, int *);
12612
5648df74395f Trent Mick:
Guido van Rossum <guido@python.org>
parents: 12570
diff changeset
665 if (arg == Py_None)
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
666 *q = 0;
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
667 else
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
668 *q = PyString_Size(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
669 format++;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
670 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
671 else if (*p != NULL &&
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
672 (int)strlen(*p) != PyString_Size(arg))
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
673 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
674 "string without null bytes or None",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
675 arg, msgbuf);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
676 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
677 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
678 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
679
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
680 case 'e': {/* encoded string */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
681 char **buffer;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
682 const char *encoding;
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
683 PyObject *s;
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
684 int size, recode_strings;
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
685
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
686 /* Get 'e' parameter: the encoding name */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
687 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
688 #ifdef Py_USING_UNICODE
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
689 if (encoding == NULL)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
690 encoding = PyUnicode_GetDefaultEncoding();
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
691 #endif
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
692
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
693 /* Get output buffer parameter:
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
694 's' (recode all objects via Unicode) or
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
695 't' (only recode non-string objects)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
696 */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
697 if (*format == 's')
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
698 recode_strings = 1;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
699 else if (*format == 't')
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
700 recode_strings = 0;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
701 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
702 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
703 "(unknown parser marker combination)",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
704 arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
705 buffer = (char **)va_arg(*p_va, char **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
706 format++;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
707 if (buffer == NULL)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
708 return converterr("(buffer is NULL)",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
709 arg, msgbuf);
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
710
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
711 /* Encode object */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
712 if (!recode_strings && PyString_Check(arg)) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
713 s = arg;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
714 Py_INCREF(s);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
715 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
716 else {
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
717 #ifdef Py_USING_UNICODE
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
718 PyObject *u;
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
719
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
720 /* Convert object to Unicode */
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
721 u = PyUnicode_FromObject(arg);
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
722 if (u == NULL)
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
723 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
724 "string or unicode or text buffer",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
725 arg, msgbuf);
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
726
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
727 /* Encode object; use default error handling */
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
728 s = PyUnicode_AsEncodedString(u,
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
729 encoding,
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
730 NULL);
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
731 Py_DECREF(u);
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
732 if (s == NULL)
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
733 return converterr("(encoding failed)",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
734 arg, msgbuf);
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
735 if (!PyString_Check(s)) {
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
736 Py_DECREF(s);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
737 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
738 "(encoder failed to return a string)",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
739 arg, msgbuf);
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
740 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
741 #else
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
742 return converterr("string<e>", arg, msgbuf);
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
743 #endif
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
744 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
745 size = PyString_GET_SIZE(s);
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
746
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
747 /* 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
748 if (*format == '#') {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
749 /* Using buffer length parameter '#':
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
750
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
751 - 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
752 needed size is allocated and the data
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
753 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
754 to the new buffer; the caller is
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
755 responsible for PyMem_Free()ing it after
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
756 usage
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
757
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
758 - 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
759 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
760 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
761 buffer overflow is signalled with an error;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
762 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
763 encoded string plus the trailing 0-byte
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
764
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
765 - 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
766 the size of the buffer /excluding/ the
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
767 trailing 0-byte
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
768
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
769 */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
770 int *buffer_len = va_arg(*p_va, int *);
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
771
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
772 format++;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
773 if (buffer_len == NULL)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
774 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
775 "(buffer_len is NULL)",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
776 arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
777 if (*buffer == NULL) {
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
778 *buffer = PyMem_NEW(char, size + 1);
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
779 if (*buffer == NULL) {
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
780 Py_DECREF(s);
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
781 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
782 "(memory error)",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
783 arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
784 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
785 } else {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
786 if (size + 1 > *buffer_len) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
787 Py_DECREF(s);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
788 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
789 "(buffer overflow)",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
790 arg, msgbuf);
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
791 }
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
792 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
793 memcpy(*buffer,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
794 PyString_AS_STRING(s),
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
795 size + 1);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
796 *buffer_len = size;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
797 } else {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
798 /* Using a 0-terminated buffer:
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
799
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
800 - 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
801 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
802 error raised
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
803
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
804 - 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
805 allocated and the data copied into it;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
806 *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
807 buffer; the caller is responsible for
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
808 PyMem_Free()ing it after usage
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
809
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
810 */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
811 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
812 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
813 "(encoded string without NULL bytes)",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
814 arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
815 *buffer = PyMem_NEW(char, size + 1);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
816 if (*buffer == NULL) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
817 Py_DECREF(s);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
818 return converterr("(memory error)",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
819 arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
820 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
821 memcpy(*buffer,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
822 PyString_AS_STRING(s),
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
823 size + 1);
12051
d89556c04ef9 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 11975
diff changeset
824 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
825 Py_DECREF(s);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
826 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
827 }
12570
3dbe41380266 Brian Hooper <brian_takashi@hotmail.com>:
Fred Drake <fdrake@acm.org>
parents: 12510
diff changeset
828
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
829 #ifdef Py_USING_UNICODE
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
830 case 'u': {/* raw unicode buffer (Py_UNICODE *) */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
831 if (*format == '#') { /* any buffer-like object */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
832 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
833 int *q = va_arg(*p_va, int *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
834 char *buf;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
835 int count = convertbuffer(arg, p, &buf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
836
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
837 if (count < 0)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
838 return converterr(buf, arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
839 *q = count/(sizeof(Py_UNICODE));
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
840 format++;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
841 } else {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
842 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
843
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
844 if (PyUnicode_Check(arg))
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
845 *p = PyUnicode_AS_UNICODE(arg);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
846 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
847 return converterr("unicode", arg, msgbuf);
12570
3dbe41380266 Brian Hooper <brian_takashi@hotmail.com>:
Fred Drake <fdrake@acm.org>
parents: 12510
diff changeset
848 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
849 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
850 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
851 #endif
12570
3dbe41380266 Brian Hooper <brian_takashi@hotmail.com>:
Fred Drake <fdrake@acm.org>
parents: 12510
diff changeset
852
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
853 case 'S': { /* string object */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
854 PyObject **p = va_arg(*p_va, PyObject **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
855 if (PyString_Check(arg))
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
856 *p = arg;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
857 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
858 return converterr("string", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
859 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
860 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
861
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
862 #ifdef Py_USING_UNICODE
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
863 case 'U': { /* Unicode object */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
864 PyObject **p = va_arg(*p_va, PyObject **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
865 if (PyUnicode_Check(arg))
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
866 *p = arg;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
867 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
868 return converterr("unicode", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
869 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
870 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 18887
diff changeset
871 #endif
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
872
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
873 case 'O': { /* object */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
874 PyTypeObject *type;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
875 PyObject **p;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
876 if (*format == '!') {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
877 type = va_arg(*p_va, PyTypeObject*);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
878 p = va_arg(*p_va, PyObject **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
879 format++;
19533
3e7897822459 The "O!" format code should implement an isinstance() test
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
880 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
881 *p = arg;
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
882 else
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
883 return converterr(type->tp_name, arg, msgbuf);
8358
da4bdceeaad7 Another veeeeeery old patch...
Guido van Rossum <guido@python.org>
parents: 7982
diff changeset
884
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
885 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
886 else if (*format == '?') {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
887 inquiry pred = va_arg(*p_va, inquiry);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
888 p = va_arg(*p_va, PyObject **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
889 format++;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
890 if ((*pred)(arg))
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
891 *p = arg;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
892 else
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
893 return converterr("(unspecified)",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
894 arg, msgbuf);
8358
da4bdceeaad7 Another veeeeeery old patch...
Guido van Rossum <guido@python.org>
parents: 7982
diff changeset
895
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
896 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
897 else if (*format == '&') {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
898 typedef int (*converter)(PyObject *, void *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
899 converter convert = va_arg(*p_va, converter);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
900 void *addr = va_arg(*p_va, void *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
901 format++;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
902 if (! (*convert)(arg, addr))
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
903 return converterr("(unspecified)",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
904 arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
905 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
906 else {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
907 p = va_arg(*p_va, PyObject **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
908 *p = arg;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
909 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
910 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
911 }
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
912
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
913
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
914 case 'w': { /* memory buffer, read-write access */
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
915 void **p = va_arg(*p_va, void **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
916 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
917 int count;
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
918
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
919 if (pb == NULL ||
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
920 pb->bf_getwritebuffer == NULL ||
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
921 pb->bf_getsegcount == NULL)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
922 return converterr("read-write buffer", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
923 if ((*pb->bf_getsegcount)(arg, NULL) != 1)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
924 return converterr("single-segment read-write buffer",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
925 arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
926 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
927 return converterr("(unspecified)", arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
928 if (*format == '#') {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
929 int *q = va_arg(*p_va, int *);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
930
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
931 *q = count;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
932 format++;
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
933 }
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
934 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
935 }
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
936
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
937 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
938 const char **p = va_arg(*p_va, const char **);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
939 char *buf;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
940 int count;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
941
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
942 if (*format++ != '#')
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
943 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
944 "invalid use of 't' format character",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
945 arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
946 if (!PyType_HasFeature(arg->ob_type,
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
947 Py_TPFLAGS_HAVE_GETCHARBUFFER))
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
948 return converterr(
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
949 "string or read-only character buffer",
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
950 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
951
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
952 count = convertbuffer(arg, (void **)p, &buf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
953 if (count < 0)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
954 return converterr(buf, arg, msgbuf);
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
955 *va_arg(*p_va, int *) = count;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
956 break;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
957 }
9306
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
958
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
959 default:
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
960 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
961
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
962 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
963
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
964 *p_format = format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
965 return NULL;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
966 }
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
967
17996
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
968 int convertbuffer(PyObject *arg, void **p, char **errmsg)
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
969 {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
970 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
971 int count;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
972 if (pb == NULL ||
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
973 pb->bf_getreadbuffer == NULL ||
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
974 pb->bf_getsegcount == NULL) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
975 *errmsg = "string or read-only buffer";
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
976 return -1;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
977 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
978 if ((*pb->bf_getsegcount)(arg, NULL) != 1) {
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
979 *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
980 return -1;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
981 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
982 if ((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
983 *errmsg = "(unspecified)";
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
984 }
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
985 return count;
5a9debb14440 Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17857
diff changeset
986 }
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
987
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
988 /* 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
989 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
990
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
991 int PyArg_ParseTupleAndKeywords(PyObject *args,
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
992 PyObject *keywords,
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
993 char *format,
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
994 char **kwlist, ...)
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
995 {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
996 int retval;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
997 va_list va;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
998
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
999 va_start(va, kwlist);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1000 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
1001 va_end(va);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1002 return retval;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1003 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1004
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1005
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1006 static int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
1007 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
1008 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
1009 {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1010 char msgbuf[256];
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1011 int levels[32];
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1012 char *fname = NULL;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1013 char *message = NULL;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1014 int min = -1;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1015 int max = 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1016 char *formatsave = format;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1017 int i, len, tplen, kwlen;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1018 char *msg, *ks, **p;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1019 int nkwds, pos, match, converted;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1020 PyObject *key, *value;
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1021
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1022 /* nested tuples cannot be parsed when using keyword arguments */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1023
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1024 for (;;) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1025 int c = *format++;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1026 if (c == '(') {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1027 PyErr_SetString(PyExc_SystemError,
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1028 "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
1029 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1030 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1031 else if (c == '\0')
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1032 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1033 else if (c == ':') {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1034 fname = format;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1035 break;
17856
2807949e0ba5 vgetargs1() and vgetargskeywords(): Replace uses of PyTuple_Size() and
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17817
diff changeset
1036 } else if (c == ';') {
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1037 message = format;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1038 break;
17856
2807949e0ba5 vgetargs1() and vgetargskeywords(): Replace uses of PyTuple_Size() and
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17817
diff changeset
1039 } else if (c == 'e')
14467
142cb4e7310c This patch hopefully fixes the problem with "es#" and "es" in
Marc-André Lemburg <mal@egenix.com>
parents: 14375
diff changeset
1040 ; /* Pass */
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1041 else if (isalpha(c))
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1042 max++;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1043 else if (c == '|')
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1044 min = max;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1045 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1046
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1047 if (min < 0)
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1048 min = max;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1049
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1050 format = formatsave;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1051
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1052 if (!PyTuple_Check(args)) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1053 PyErr_SetString(PyExc_SystemError,
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1054 "new style getargs format but argument is not a tuple");
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1055 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1056 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1057
17856
2807949e0ba5 vgetargs1() and vgetargskeywords(): Replace uses of PyTuple_Size() and
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17817
diff changeset
1058 tplen = PyTuple_GET_SIZE(args);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1059
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1060 /* do a cursory check of the keywords just to see how many we got */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1061
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1062 if (keywords) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1063 if (!PyDict_Check(keywords)) {
16264
e18889e3949c Better error message when non-dictionary received for **kwarg
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15899
diff changeset
1064 if (keywords == NULL)
e18889e3949c Better error message when non-dictionary received for **kwarg
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15899
diff changeset
1065 PyErr_SetString(PyExc_SystemError,
e18889e3949c Better error message when non-dictionary received for **kwarg
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15899
diff changeset
1066 "NULL received when keyword dictionary expected");
e18889e3949c Better error message when non-dictionary received for **kwarg
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15899
diff changeset
1067 else
e18889e3949c Better error message when non-dictionary received for **kwarg
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15899
diff changeset
1068 PyErr_Format(PyExc_SystemError,
e18889e3949c Better error message when non-dictionary received for **kwarg
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15899
diff changeset
1069 "%s received when keyword dictionary expected",
e18889e3949c Better error message when non-dictionary received for **kwarg
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15899
diff changeset
1070 keywords->ob_type->tp_name);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1071 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1072 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1073 kwlen = PyDict_Size(keywords);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1074 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1075 else {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1076 kwlen = 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1077 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1078
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1079 /* 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
1080 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
1081 keyword parameter in messages */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1082
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1083 if (keywords) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1084 for (i = 0; i < tplen; i++) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1085 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1086 sprintf(msgbuf,
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1087 "keyword parameter %s redefined",
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1088 kwlist[i]);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1089 PyErr_SetString(PyExc_TypeError, msgbuf);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1090 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1091 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1092 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1093 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1094 PyErr_Clear(); /* I'm not which Py functions set the error string */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1095
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1096 /* required arguments missing from args can be supplied by keyword
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1097 arguments */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1098
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1099 len = tplen;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1100 if (keywords && tplen < min) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1101 for (i = tplen; i < min; i++) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1102 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1103 len++;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1104 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1105 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1106 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1107 PyErr_Clear();
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1108
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1109 /* 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
1110 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
1111 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
1112 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
1113
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1114 if (len < min || max < len) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1115 if (message == NULL) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1116 sprintf(msgbuf,
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
1117 "%s%s takes %s %d argument%s (%d given)",
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1118 fname==NULL ? "function" : fname,
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
1119 fname==NULL ? "" : "()",
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1120 min==max ? "exactly"
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1121 : len < min ? "at least" : "at most",
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1122 len < min ? min : max,
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1123 (len < min ? min : max) == 1 ? "" : "s",
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1124 len);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1125 message = msgbuf;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1126 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1127 PyErr_SetString(PyExc_TypeError, message);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1128 return 0;
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
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1131 for (i = 0; i < tplen; i++) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1132 if (*format == '|')
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1133 format++;
17856
2807949e0ba5 vgetargs1() and vgetargskeywords(): Replace uses of PyTuple_Size() and
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17817
diff changeset
1134 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
1135 levels, msgbuf);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1136 if (msg) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1137 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
1138 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1139 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1140 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1141
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1142 /* handle no keyword parameters in call */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1143
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1144 if (!keywords) return 1;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1145
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1146 /* make sure the number of keywords in the keyword list matches the
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1147 number of items in the format string */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1148
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1149 nkwds = 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1150 p = kwlist;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1151 for (;;) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1152 if (!*(p++)) break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1153 nkwds++;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1154 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1155
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1156 if (nkwds != max) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1157 PyErr_SetString(PyExc_SystemError,
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1158 "number of items in format string and keyword list do not match");
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1159 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1160 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1161
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1162 /* 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
1163 string where it was left after processing args */
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 converted = 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1166 for (i = tplen; i < nkwds; i++) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1167 PyObject *item;
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1168 if (*format == '|')
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1169 format++;
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1170 item = PyMapping_GetItemString(keywords, kwlist[i]);
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1171 if (item != NULL) {
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1172 msg = convertitem(item, &format, p_va, levels, msgbuf);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1173 if (msg) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1174 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
1175 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1176 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1177 converted++;
15502
daadd1e85316 vgetargskeywords(): Patch for memory leak identified in bug #119862.
Barry Warsaw <barry@python.org>
parents: 15465
diff changeset
1178 Py_DECREF(item);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1179 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1180 else {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1181 PyErr_Clear();
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1182 msg = skipitem(&format, p_va);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1183 if (msg) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1184 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
1185 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1186 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1187 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1188 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1189
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1190 /* make sure there are no extraneous keyword arguments */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1191
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1192 pos = 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1193 if (converted < kwlen) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1194 while (PyDict_Next(keywords, &pos, &key, &value)) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1195 match = 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1196 ks = PyString_AsString(key);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1197 for (i = 0; i < nkwds; i++) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1198 if (!strcmp(ks, kwlist[i])) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1199 match = 1;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1200 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1201 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1202 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1203 if (!match) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1204 sprintf(msgbuf,
12612
5648df74395f Trent Mick:
Guido van Rossum <guido@python.org>
parents: 12570
diff changeset
1205 "%s is an invalid keyword argument for this function",
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1206 ks);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1207 PyErr_SetString(PyExc_TypeError, msgbuf);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1208 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1209 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1210 }
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 return 1;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1214 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1215
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1216
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1217 static char *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
1218 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
1219 {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1220 char *format = *p_format;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1221 char c = *format++;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1222
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1223 switch (c) {
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 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
1226 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
1227 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1228 (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
1229 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1230 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1231
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1232 case 'h': /* short int */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1233 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1234 (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
1235 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1236 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1237
13872
35fc9511a36f Changed H specifier to mean "bitfield", i.e. any value from
Jack Jansen <jack.jansen@cwi.nl>
parents: 13837
diff changeset
1238 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
1239 {
113d833eea7e Added support for H (unsigned short) specifier in PyArg_ParseTuple and
Jack Jansen <jack.jansen@cwi.nl>
parents: 13268
diff changeset
1240 (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
1241 break;
113d833eea7e Added support for H (unsigned short) specifier in PyArg_ParseTuple and
Jack Jansen <jack.jansen@cwi.nl>
parents: 13268
diff changeset
1242 }
113d833eea7e Added support for H (unsigned short) specifier in PyArg_ParseTuple and
Jack Jansen <jack.jansen@cwi.nl>
parents: 13268
diff changeset
1243
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1244 case 'i': /* int */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1245 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1246 (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
1247 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1248 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1249
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1250 case 'l': /* long int */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1251 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1252 (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
1253 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1254 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1255
9949
98e37347378b Change rare occurrences of #if HAVE_LONG_LONG to #ifdef.
Guido van Rossum <guido@python.org>
parents: 9306
diff changeset
1256 #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
1257 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
1258 {
9044
d437b6683e24 Patch by Mark Hammond to support 64-bit ints on MS platforms.
Guido van Rossum <guido@python.org>
parents: 8822
diff changeset
1259 (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
1260 break;
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
1261 }
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
1262 #endif
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
1263
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1264 case 'f': /* float */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1265 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1266 (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
1267 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1268 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1269
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1270 case 'd': /* double */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1271 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1272 (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
1273 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1274 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1275
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1276 #ifndef WITHOUT_COMPLEX
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1277 case 'D': /* complex double */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1278 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1279 (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
1280 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1281 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1282 #endif /* WITHOUT_COMPLEX */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1283
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1284 case 'c': /* char */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1285 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1286 (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
1287 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1288 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1289
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1290 case 's': /* string */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1291 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1292 (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
1293 if (*format == '#') {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1294 (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
1295 format++;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1296 }
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 'z': /* 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 'S': /* string object */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1311 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1312 (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
1313 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1314 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1315
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1316 case 'O': /* object */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1317 {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1318 if (*format == '!') {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1319 format++;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1320 (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
1321 (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
1322 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1323 #if 0
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1324 /* 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
1325 else if (*format == '?') {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1326 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
1327 format++;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1328 if ((*pred)(arg)) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1329 (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
1330 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1331 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1332 #endif
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1333 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
1334 typedef int (*converter)(PyObject *, void *);
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1335 (void) va_arg(*p_va, converter);
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1336 (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
1337 format++;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1338 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1339 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1340 (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
1341 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1342 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1343 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1344
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1345 default:
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1346 return "impossible<bad format char>";
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1347
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
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1350 *p_format = format;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1351 return NULL;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1352 }