annotate Python/getargs.c @ 11975:876f35828e87 legacy-trunk

Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode object.
author Guido van Rossum <guido@python.org>
date Fri, 10 Mar 2000 23:02:17 +0000
parents 0ef1071cb7fe
children d89556c04ef9
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 /***********************************************************
2062
d0d0a69b5ca3 Added 1995 to copyright message.
Guido van Rossum <guido@python.org>
parents: 2052
diff changeset
2 Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
d0d0a69b5ca3 Added 1995 to copyright message.
Guido van Rossum <guido@python.org>
parents: 2052
diff changeset
3 The Netherlands.
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
4
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 All Rights Reserved
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
6
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 Permission to use, copy, modify, and distribute this software and its
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 documentation for any purpose and without fee is hereby granted,
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 provided that the above copyright notice appear in all copies and that
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 both that copyright notice and this permission notice appear in
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 supporting documentation, and that the names of Stichting Mathematisch
4503
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4102
diff changeset
12 Centrum or CWI or Corporation for National Research Initiatives or
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4102
diff changeset
13 CNRI not be used in advertising or publicity pertaining to
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4102
diff changeset
14 distribution of the software without specific, written prior
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4102
diff changeset
15 permission.
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4102
diff changeset
16
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4102
diff changeset
17 While CWI is the initial source for this software, a modified version
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4102
diff changeset
18 is made available by the Corporation for National Research Initiatives
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4102
diff changeset
19 (CNRI) at the Internet address ftp://ftp.python.org.
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
20
4503
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4102
diff changeset
21 STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4102
diff changeset
22 REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4102
diff changeset
23 MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4102
diff changeset
24 CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4102
diff changeset
25 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4102
diff changeset
26 PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4102
diff changeset
27 TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4102
diff changeset
28 PERFORMANCE OF THIS SOFTWARE.
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
29
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 ******************************************************************/
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
31
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 /* New getargs implementation */
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
33
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 /* 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
35 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
36 XXX Python source (or in an extension) uses ridiculously long names
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 XXX or riduculously deep nesting in format strings. */
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
38
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
39 #include "Python.h"
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
40
4102
9569664ac347 Add needed #include <ctype.h>
Guido van Rossum <guido@python.org>
parents: 4026
diff changeset
41 #include <ctype.h>
9569664ac347 Add needed #include <ctype.h>
Guido van Rossum <guido@python.org>
parents: 4026
diff changeset
42
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
43
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
44 int PyArg_Parse Py_PROTO((PyObject *, char *, ...));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
45 int PyArg_ParseTuple Py_PROTO((PyObject *, char *, ...));
5408
648124a5880a Fix old typo PyArgs_VaParse -> PyArg_VaParse.
Guido van Rossum <guido@python.org>
parents: 5373
diff changeset
46 int PyArg_VaParse Py_PROTO((PyObject *, char *, va_list));
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
47
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
48 int PyArg_ParseTupleAndKeywords Py_PROTO((PyObject *, PyObject *,
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
49 char *, char **, ...));
1913
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 /* Forward */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
52 static int vgetargs1 Py_PROTO((PyObject *, char *, va_list *, int));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
53 static void seterror Py_PROTO((int, char *, int *, char *, char *));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
54 static char *convertitem Py_PROTO((PyObject *, char **, va_list *,
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
55 int *, char *));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
56 static char *converttuple Py_PROTO((PyObject *, char **, va_list *,
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 int *, char *, int));
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
58 static char *convertsimple Py_PROTO((PyObject *, char **, va_list *, char *));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
59 static char *convertsimple1 Py_PROTO((PyObject *, char **, va_list *));
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
60
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
61 static int vgetargskeywords Py_PROTO((PyObject *, PyObject *,
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
62 char *, char **, va_list *));
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
63 static char *skipitem Py_PROTO((char **, va_list *));
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
64
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 #ifdef HAVE_STDARG_PROTOTYPES
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 /* VARARGS2 */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
67 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
68 #else
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 /* VARARGS */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
70 int PyArg_Parse(va_alist) va_dcl
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 #endif
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 int retval;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 va_list va;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 #ifdef HAVE_STDARG_PROTOTYPES
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
76
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 va_start(va, format);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 #else
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
79 PyObject *args;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 char *format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
81
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
82 va_start(va);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
83 args = va_arg(va, PyObject *);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 format = va_arg(va, char *);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 #endif
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
86 retval = vgetargs1(args, format, &va, 1);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 va_end(va);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 return retval;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
89 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
90
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
91
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 #ifdef HAVE_STDARG_PROTOTYPES
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 /* VARARGS2 */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
94 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
95 #else
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 /* VARARGS */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
97 int PyArg_ParseTuple(va_alist) va_dcl
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 #endif
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 int retval;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 va_list va;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 #ifdef HAVE_STDARG_PROTOTYPES
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
103
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 va_start(va, format);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
105 #else
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
106 PyObject *args;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 char *format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
108
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 va_start(va);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
110 args = va_arg(va, PyObject *);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
111 format = va_arg(va, char *);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 #endif
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
113 retval = vgetargs1(args, format, &va, 0);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 va_end(va);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 return retval;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
116 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
117
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
118
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
119 int
5408
648124a5880a Fix old typo PyArgs_VaParse -> PyArg_VaParse.
Guido van Rossum <guido@python.org>
parents: 5373
diff changeset
120 PyArg_VaParse(args, format, va)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
121 PyObject *args;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 char *format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 va_list va;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
124 {
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
125 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
126
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
127 #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
128 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
129 #else
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
130 lva = va;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
131 #endif
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
132
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
133 return vgetargs1(args, format, &lva, 0);
1913
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
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 static int
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
138 vgetargs1(args, format, p_va, compat)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
139 PyObject *args;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
140 char *format;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
141 va_list *p_va;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
142 int compat;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
143 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
144 char msgbuf[256];
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 int levels[32];
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
146 char *fname = NULL;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
147 char *message = NULL;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
148 int min = -1;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
149 int max = 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
150 int level = 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
151 char *formatsave = format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
152 int i, len;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
153 char *msg;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
154
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
155 for (;;) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
156 int c = *format++;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
157 if (c == '(' /* ')' */) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
158 if (level == 0)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
159 max++;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
160 level++;
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 if (/* '(' */ c == ')') {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
163 if (level == 0)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
164 Py_FatalError(/* '(' */
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
165 "excess ')' in getargs format");
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
166 else
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
167 level--;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
168 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
169 else if (c == '\0')
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
170 break;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
171 else if (c == ':') {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
172 fname = format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
173 break;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
174 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
175 else if (c == ';') {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
176 message = format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
177 break;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
178 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
179 else if (level != 0)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
180 ; /* Pass */
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
181 else if (isalpha(c))
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
182 max++;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
183 else if (c == '|')
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
184 min = max;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
185 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
186
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
187 if (level != 0)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
188 Py_FatalError(/* '(' */ "missing ')' in getargs format");
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
189
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
190 if (min < 0)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
191 min = max;
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 format = formatsave;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
194
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
195 if (compat) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
196 if (max == 0) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
197 if (args == NULL)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
198 return 1;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
199 sprintf(msgbuf, "%s requires no arguments",
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
200 fname==NULL ? "function" : fname);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
201 PyErr_SetString(PyExc_TypeError, msgbuf);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
202 return 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
203 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
204 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
205 if (args == NULL) {
7f8719a36662 prevent core dump for old getargs() with NULL arg
Guido van Rossum <guido@python.org>
parents: 1913
diff changeset
206 sprintf(msgbuf,
7f8719a36662 prevent core dump for old getargs() with NULL arg
Guido van Rossum <guido@python.org>
parents: 1913
diff changeset
207 "%s requires at least one argument",
7f8719a36662 prevent core dump for old getargs() with NULL arg
Guido van Rossum <guido@python.org>
parents: 1913
diff changeset
208 fname==NULL ? "function" : fname);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
209 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
210 return 0;
7f8719a36662 prevent core dump for old getargs() with NULL arg
Guido van Rossum <guido@python.org>
parents: 1913
diff changeset
211 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2004
diff changeset
212 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
213 if (msg == NULL)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
214 return 1;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
215 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
216 return 0;
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 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
219 PyErr_SetString(PyExc_SystemError,
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
220 "old style getargs format uses new features");
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
221 return 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
222 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
224
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
225 if (!PyTuple_Check(args)) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
226 PyErr_SetString(PyExc_SystemError,
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
227 "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
228 return 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
229 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
230
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
231 len = PyTuple_Size(args);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
232
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
233 if (len < min || max < len) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
234 if (message == NULL) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
235 sprintf(msgbuf,
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
236 "%s requires %s %d argument%s; %d given",
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
237 fname==NULL ? "function" : fname,
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
238 min==max ? "exactly"
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
239 : len < min ? "at least" : "at most",
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
240 len < min ? min : max,
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
241 (len < min ? min : max) == 1 ? "" : "s",
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
242 len);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
243 message = msgbuf;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
244 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
245 PyErr_SetString(PyExc_TypeError, message);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
246 return 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
247 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
248
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
249 for (i = 0; i < len; i++) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
250 if (*format == '|')
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
251 format++;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
252 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
253 levels, msgbuf);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
254 if (msg) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
255 seterror(i+1, msg, levels, fname, message);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
256 return 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
257 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
258 }
6805
93e480dedcf0 Add explicit check for correct next character in format at end of
Guido van Rossum <guido@python.org>
parents: 5410
diff changeset
259
7982
a909a2869ac5 Make new gcc -Wall happy
Guido van Rossum <guido@python.org>
parents: 7120
diff changeset
260 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
261 *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
262 *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
263 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
264 "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
265 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
266 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
267
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
268 return 1;
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
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
272
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
273 static void
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
274 seterror(iarg, msg, levels, fname, message)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
275 int iarg;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
276 char *msg;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
277 int *levels;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
278 char *fname;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
279 char *message;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
280 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
281 char buf[256];
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
282 int i;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
283 char *p = buf;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
284
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
285 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
286 return;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
287 if (iarg == 0 && message == NULL)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
288 message = msg;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
289 else if (message == NULL) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
290 if (fname != NULL) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
291 sprintf(p, "%s, ", fname);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
292 p += strlen(p);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
293 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
294 sprintf(p, "argument %d", iarg);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
295 i = 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
296 p += strlen(p);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
297 while (levels[i] > 0) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
298 sprintf(p, ", item %d", levels[i]-1);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
299 p += strlen(p);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
300 i++;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
301 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
302 sprintf(p, ": expected %s found", msg);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
303 message = buf;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
304 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
305 PyErr_SetString(PyExc_TypeError, message);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
306 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
307
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
308
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
309 /* Convert a tuple argument.
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
310 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
311 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
312 If successful:
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
313 *p_format and *p_va are updated,
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
314 *levels and *msgbuf are untouched,
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
315 and NULL is returned.
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
316 If the argument is invalid:
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
317 *p_format is unchanged,
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
318 *p_va is undefined,
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
319 *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
320 *msgbuf contains an error message, whose format is:
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
321 "<typename1>, <typename2>", where:
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
322 <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
323 <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
324 (so you can surround it by "expected ... found"),
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
325 and msgbuf is returned.
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
326 */
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 static char *
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
329 converttuple(arg, p_format, p_va, levels, msgbuf, toplevel)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
330 PyObject *arg;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
331 char **p_format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
332 va_list *p_va;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
333 int *levels;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
334 char *msgbuf;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
335 int toplevel;
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 int level = 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
338 int n = 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
339 char *format = *p_format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
340 int i;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
341
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
342 for (;;) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
343 int c = *format++;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
344 if (c == '(') {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
345 if (level == 0)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
346 n++;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
347 level++;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
348 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
349 else if (c == ')') {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
350 if (level == 0)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
351 break;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
352 level--;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
353 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
354 else if (c == ':' || c == ';' || c == '\0')
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
355 break;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
356 else if (level == 0 && isalpha(c))
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
357 n++;
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
10220
0ef1071cb7fe Patch by Tommy Burnette to accept an arbitrary sequence when "(...)"
Guido van Rossum <guido@python.org>
parents: 9949
diff changeset
360 if (!PySequence_Check(arg)) {
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
361 levels[0] = 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
362 sprintf(msgbuf,
10220
0ef1071cb7fe Patch by Tommy Burnette to accept an arbitrary sequence when "(...)"
Guido van Rossum <guido@python.org>
parents: 9949
diff changeset
363 toplevel ? "%d arguments, %s" : "%d-sequence, %s",
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
364 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
365 return msgbuf;
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
10220
0ef1071cb7fe Patch by Tommy Burnette to accept an arbitrary sequence when "(...)"
Guido van Rossum <guido@python.org>
parents: 9949
diff changeset
368 if ((i = PySequence_Length(arg)) != n) {
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
369 levels[0] = 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
370 sprintf(msgbuf,
10220
0ef1071cb7fe Patch by Tommy Burnette to accept an arbitrary sequence when "(...)"
Guido van Rossum <guido@python.org>
parents: 9949
diff changeset
371 toplevel ? "%d arguments, %d" : "%d-sequence, %d-sequence",
0ef1071cb7fe Patch by Tommy Burnette to accept an arbitrary sequence when "(...)"
Guido van Rossum <guido@python.org>
parents: 9949
diff changeset
372 n, i);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
373 return msgbuf;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
374 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
375
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
376 format = *p_format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
377 for (i = 0; i < n; i++) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
378 char *msg;
10220
0ef1071cb7fe Patch by Tommy Burnette to accept an arbitrary sequence when "(...)"
Guido van Rossum <guido@python.org>
parents: 9949
diff changeset
379 PyObject *item;
0ef1071cb7fe Patch by Tommy Burnette to accept an arbitrary sequence when "(...)"
Guido van Rossum <guido@python.org>
parents: 9949
diff changeset
380 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
381 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
382 /* 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
383 Py_XDECREF(item);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
384 if (msg != NULL) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
385 levels[0] = i+1;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
386 return msg;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
387 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
388 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
389
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
390 *p_format = format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
391 return NULL;
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
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
394
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
395 /* Convert a single item. */
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
396
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
397 static char *
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
398 convertitem(arg, p_format, p_va, levels, msgbuf)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
399 PyObject *arg;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
400 char **p_format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
401 va_list *p_va;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
402 int *levels;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
403 char *msgbuf;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
404 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
405 char *msg;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
406 char *format = *p_format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
407
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
408 if (*format == '(' /* ')' */) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
409 format++;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
410 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
411 if (msg == NULL)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
412 format++;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
413 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
414 else {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
415 msg = convertsimple(arg, &format, p_va, msgbuf);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
416 if (msg != NULL)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
417 levels[0] = 0;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
418 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
419 if (msg == NULL)
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
420 *p_format = format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
421 return msg;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
422 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
423
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
424
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
425 /* Convert a non-tuple argument. Adds to convertsimple1 functionality
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
426 by appending ", <actual argument type>" to error message. */
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
427
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
428 static char *
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
429 convertsimple(arg, p_format, p_va, msgbuf)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
430 PyObject *arg;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
431 char **p_format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
432 va_list *p_va;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
433 char *msgbuf;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
434 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
435 char *msg = convertsimple1(arg, p_format, p_va);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
436 if (msg != NULL) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
437 sprintf(msgbuf, "%.50s, %.50s", msg,
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
438 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
439 msg = msgbuf;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
440 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
441 return msg;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
442 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
443
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
444
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
445 /* Convert a non-tuple argument. Return NULL if conversion went OK,
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
446 or a string representing the expected type if the conversion failed.
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
447 When failing, an exception may or may not have been raised.
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
448 Don't call if a tuple is expected. */
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
449
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
450 static char *
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
451 convertsimple1(arg, p_format, p_va)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
452 PyObject *arg;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
453 char **p_format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
454 va_list *p_va;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
455 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
456 char *format = *p_format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
457 char c = *format++;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
458
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
459 switch (c) {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
460
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
461 case 'b': /* byte -- very short int */
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
462 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
463 char *p = va_arg(*p_va, char *);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
464 long ival = PyInt_AsLong(arg);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
465 if (ival == -1 && PyErr_Occurred())
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
466 return "integer<b>";
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
467 else
5317
c72c7e1930b3 Keep gcc -Wall and Microsoft VC happy.
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
468 *p = (char) ival;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
469 break;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
470 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
471
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
472 case 'h': /* short int */
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
473 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
474 short *p = va_arg(*p_va, short *);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
475 long ival = PyInt_AsLong(arg);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
476 if (ival == -1 && PyErr_Occurred())
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
477 return "integer<h>";
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
478 else
5317
c72c7e1930b3 Keep gcc -Wall and Microsoft VC happy.
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
479 *p = (short) ival;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
480 break;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
481 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
482
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
483 case 'i': /* int */
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
484 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
485 int *p = va_arg(*p_va, int *);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
486 long ival = PyInt_AsLong(arg);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
487 if (ival == -1 && PyErr_Occurred())
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
488 return "integer<i>";
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
489 else
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
490 *p = ival;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
491 break;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
492 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
493
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
494 case 'l': /* long int */
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
495 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
496 long *p = va_arg(*p_va, long *);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
497 long ival = PyInt_AsLong(arg);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
498 if (ival == -1 && PyErr_Occurred())
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
499 return "integer<l>";
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
500 else
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
501 *p = ival;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
502 break;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
503 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
504
9949
98e37347378b Change rare occurrences of #if HAVE_LONG_LONG to #ifdef.
Guido van Rossum <guido@python.org>
parents: 9306
diff changeset
505 #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
506 case 'L': /* LONG_LONG */
8822
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
507 {
9044
d437b6683e24 Patch by Mark Hammond to support 64-bit ints on MS platforms.
Guido van Rossum <guido@python.org>
parents: 8822
diff changeset
508 LONG_LONG *p = va_arg( *p_va, LONG_LONG * );
d437b6683e24 Patch by Mark Hammond to support 64-bit ints on MS platforms.
Guido van Rossum <guido@python.org>
parents: 8822
diff changeset
509 LONG_LONG ival = PyLong_AsLongLong( arg );
d437b6683e24 Patch by Mark Hammond to support 64-bit ints on MS platforms.
Guido van Rossum <guido@python.org>
parents: 8822
diff changeset
510 if( ival == (LONG_LONG)-1 && PyErr_Occurred() ) {
8822
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
511 return "long<L>";
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
512 } else {
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
513 *p = ival;
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
514 }
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
515 break;
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
516 }
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
517 #endif
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
518
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
519 case 'f': /* float */
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
520 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
521 float *p = va_arg(*p_va, float *);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
522 double dval = PyFloat_AsDouble(arg);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
523 if (PyErr_Occurred())
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
524 return "float<f>";
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
525 else
5317
c72c7e1930b3 Keep gcc -Wall and Microsoft VC happy.
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
526 *p = (float) dval;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
527 break;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
528 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
529
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
530 case 'd': /* double */
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
531 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
532 double *p = va_arg(*p_va, double *);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
533 double dval = PyFloat_AsDouble(arg);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
534 if (PyErr_Occurred())
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
535 return "float<d>";
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
536 else
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
537 *p = dval;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
538 break;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
539 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
540
3766
516490c8192c Py_complex; and WITHOUT_COMPLEX added to getargs.c
Guido van Rossum <guido@python.org>
parents: 3323
diff changeset
541 #ifndef WITHOUT_COMPLEX
3323
6098aaa8ae7f changes for complex numbers
Guido van Rossum <guido@python.org>
parents: 2210
diff changeset
542 case 'D': /* complex double */
6098aaa8ae7f changes for complex numbers
Guido van Rossum <guido@python.org>
parents: 2210
diff changeset
543 {
3766
516490c8192c Py_complex; and WITHOUT_COMPLEX added to getargs.c
Guido van Rossum <guido@python.org>
parents: 3323
diff changeset
544 Py_complex *p = 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
545 Py_complex cval;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
546 cval = PyComplex_AsCComplex(arg);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
547 if (PyErr_Occurred())
3323
6098aaa8ae7f changes for complex numbers
Guido van Rossum <guido@python.org>
parents: 2210
diff changeset
548 return "complex<D>";
6098aaa8ae7f changes for complex numbers
Guido van Rossum <guido@python.org>
parents: 2210
diff changeset
549 else
6098aaa8ae7f changes for complex numbers
Guido van Rossum <guido@python.org>
parents: 2210
diff changeset
550 *p = cval;
6098aaa8ae7f changes for complex numbers
Guido van Rossum <guido@python.org>
parents: 2210
diff changeset
551 break;
6098aaa8ae7f changes for complex numbers
Guido van Rossum <guido@python.org>
parents: 2210
diff changeset
552 }
3766
516490c8192c Py_complex; and WITHOUT_COMPLEX added to getargs.c
Guido van Rossum <guido@python.org>
parents: 3323
diff changeset
553 #endif /* WITHOUT_COMPLEX */
3323
6098aaa8ae7f changes for complex numbers
Guido van Rossum <guido@python.org>
parents: 2210
diff changeset
554
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
555 case 'c': /* char */
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
556 {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
557 char *p = va_arg(*p_va, char *);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
558 if (PyString_Check(arg) && PyString_Size(arg) == 1)
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
559 *p = PyString_AsString(arg)[0];
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
560 else
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
561 return "char";
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
562 break;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
563 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
564
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
565 case 's': /* string */
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
566 {
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
567 if (*format == '#') { /* any buffer-like object */
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
568 void **p = (void **)va_arg(*p_va, char **);
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
569 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
570 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
571 int count;
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
572
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
573 if ( pb == NULL ||
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
574 pb->bf_getreadbuffer == NULL ||
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
575 pb->bf_getsegcount == NULL )
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
576 return "read-only buffer";
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
577 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
578 return "single-segment read-only buffer";
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
579 if ( (count =
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
580 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
581 return "(unspecified)";
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
582 *q = count;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
583 format++;
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
584 } else {
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
585 char **p = va_arg(*p_va, char **);
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
586
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
587 if (PyString_Check(arg))
11975
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
588 *p = PyString_AS_STRING(arg);
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
589 else if (PyUnicode_Check(arg)) {
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
590 arg = PyUnicode_AsUTF8String(arg);
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
591 if (arg == NULL)
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
592 return "unicode conversion error";
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
593 *p = PyString_AS_STRING(arg);
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
594 }
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
595 else
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
596 return "string";
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
597 if ((int)strlen(*p) != PyString_Size(arg))
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
598 return "string without null bytes";
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
599 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
600 break;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
601 }
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
602
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
603 case 'z': /* string, may be NULL (None) */
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
604 {
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
605 if (*format == '#') { /* any buffer-like object */
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
606 void **p = (void **)va_arg(*p_va, char **);
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
607 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
608 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
609 int count;
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
610
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
611 if (arg == Py_None) {
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
612 *p = 0;
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
613 *q = 0;
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
614 } else {
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
615 if ( pb == NULL ||
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
616 pb->bf_getreadbuffer == NULL ||
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
617 pb->bf_getsegcount == NULL )
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
618 return "read-only buffer";
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
619 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
620 return "single-segment read-only buffer";
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
621 if ( (count = (*pb->bf_getreadbuffer)
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
622 (arg, 0, p)) < 0 )
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
623 return "(unspecified)";
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
624 *q = count;
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
625 }
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
626 format++;
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
627 } else {
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
628 char **p = va_arg(*p_va, char **);
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
629
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
630 if (arg == Py_None)
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
631 *p = 0;
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
632 else if (PyString_Check(arg))
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
633 *p = PyString_AsString(arg);
11975
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
634 else if (PyUnicode_Check(arg)) {
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
635 arg = PyUnicode_AsUTF8String(arg);
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
636 if (arg == NULL)
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
637 return "unicode conversion error";
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
638 *p = PyString_AS_STRING(arg);
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
639 }
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
640 else
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
641 return "None or string";
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
642 if (*format == '#') {
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
643 int *q = va_arg(*p_va, int *);
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
644 if (arg == Py_None)
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
645 *q = 0;
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
646 else
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
647 *q = PyString_Size(arg);
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
648 format++;
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
649 }
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
650 else if (*p != NULL &&
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
651 (int)strlen(*p) != PyString_Size(arg))
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
652 return "None or string without null bytes";
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
653 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
654 break;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
655 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
656
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
657 case 'S': /* string object */
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
658 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
659 PyObject **p = va_arg(*p_va, PyObject **);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
660 if (PyString_Check(arg))
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
661 *p = arg;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
662 else
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
663 return "string";
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
664 break;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
665 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
666
11975
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
667 case 'U': /* Unicode object */
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
668 {
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
669 PyObject **p = va_arg(*p_va, PyObject **);
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
670 if (PyUnicode_Check(arg))
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
671 *p = arg;
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
672 else
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
673 return "unicode";
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
674 break;
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
675 }
876f35828e87 Marc-Andre Lemburg: support for Unicode strings; 'U' expects a Unicode
Guido van Rossum <guido@python.org>
parents: 10220
diff changeset
676
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
677 case 'O': /* object */
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
678 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
679 PyTypeObject *type;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
680 PyObject **p;
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
681 if (*format == '!') {
8358
da4bdceeaad7 Another veeeeeery old patch...
Guido van Rossum <guido@python.org>
parents: 7982
diff changeset
682 type = va_arg(*p_va, PyTypeObject*);
da4bdceeaad7 Another veeeeeery old patch...
Guido van Rossum <guido@python.org>
parents: 7982
diff changeset
683 p = va_arg(*p_va, PyObject **);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
684 format++;
8358
da4bdceeaad7 Another veeeeeery old patch...
Guido van Rossum <guido@python.org>
parents: 7982
diff changeset
685 if (arg->ob_type == type)
da4bdceeaad7 Another veeeeeery old patch...
Guido van Rossum <guido@python.org>
parents: 7982
diff changeset
686 *p = arg;
da4bdceeaad7 Another veeeeeery old patch...
Guido van Rossum <guido@python.org>
parents: 7982
diff changeset
687 else
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
688 return type->tp_name;
8358
da4bdceeaad7 Another veeeeeery old patch...
Guido van Rossum <guido@python.org>
parents: 7982
diff changeset
689
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
690 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
691 else if (*format == '?') {
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
692 inquiry pred = va_arg(*p_va, inquiry);
8358
da4bdceeaad7 Another veeeeeery old patch...
Guido van Rossum <guido@python.org>
parents: 7982
diff changeset
693 p = va_arg(*p_va, PyObject **);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
694 format++;
8358
da4bdceeaad7 Another veeeeeery old patch...
Guido van Rossum <guido@python.org>
parents: 7982
diff changeset
695 if ((*pred)(arg))
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
696 *p = arg;
8358
da4bdceeaad7 Another veeeeeery old patch...
Guido van Rossum <guido@python.org>
parents: 7982
diff changeset
697 else
da4bdceeaad7 Another veeeeeery old patch...
Guido van Rossum <guido@python.org>
parents: 7982
diff changeset
698 return "(unspecified)";
da4bdceeaad7 Another veeeeeery old patch...
Guido van Rossum <guido@python.org>
parents: 7982
diff changeset
699
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
700 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
701 else if (*format == '&') {
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
702 typedef int (*converter)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
703 Py_PROTO((PyObject *, void *));
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
704 converter convert = va_arg(*p_va, converter);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
705 void *addr = va_arg(*p_va, void *);
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
706 format++;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
707 if (! (*convert)(arg, addr))
2210
e734c7235727 don't overwrite error already set (e.g. from O&)
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
708 return "(unspecified)";
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
709 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
710 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
711 p = va_arg(*p_va, PyObject **);
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
712 *p = arg;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
713 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
714 break;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
715 }
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
716
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
717
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
718 case 'w': /* memory buffer, read-write access */
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
719 {
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
720 void **p = va_arg(*p_va, void **);
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
721 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
722 int count;
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
723
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
724 if ( pb == NULL || pb->bf_getwritebuffer == NULL ||
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
725 pb->bf_getsegcount == NULL )
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
726 return "read-write buffer";
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
727 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
728 return "single-segment read-write buffer";
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
729 if ( (count = pb->bf_getwritebuffer(arg, 0, p)) < 0 )
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
730 return "(unspecified)";
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
731 if (*format == '#') {
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
732 int *q = va_arg(*p_va, int *);
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
733
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
734 *q = count;
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
735 format++;
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
736 }
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
737 break;
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
738 }
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5408
diff changeset
739
9306
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
740 case 't': /* 8-bit character buffer, read-only access */
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
741 {
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
742 const char **p = va_arg(*p_va, const char **);
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
743 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
744 int count;
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
745
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
746 if ( *format++ != '#' )
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
747 return "invalid use of 't' format character";
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
748 if ( !PyType_HasFeature(
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
749 arg->ob_type,
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
750 Py_TPFLAGS_HAVE_GETCHARBUFFER) ||
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
751 pb == NULL ||
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
752 pb->bf_getcharbuffer == NULL ||
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
753 pb->bf_getsegcount == NULL )
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
754 return "read-only character buffer";
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
755 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
756 return "single-segment read-only buffer";
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
757 if ( (count = pb->bf_getcharbuffer(arg, 0, p)) < 0 )
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
758 return "(unspecified)";
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
759
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
760 *va_arg(*p_va, int *) = count;
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
761
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
762 break;
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
763 }
79439e4e9976 Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents: 9044
diff changeset
764
1913
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
765
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
766 default:
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
767 return "impossible<bad format char>";
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
768
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
769 }
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
770
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
771 *p_format = format;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
772 return NULL;
8623aa3915db * Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff changeset
773 }
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
774
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
775
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
776 /* 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
777 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
778
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
779 #ifdef HAVE_STDARG_PROTOTYPES
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
780 /* VARARGS2 */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
781 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
782 PyObject *keywords,
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
783 char *format,
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
784 char **kwlist, ...)
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
785 #else
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
786 /* VARARGS */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
787 int PyArg_ParseTupleAndKeywords(va_alist) va_dcl
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
788 #endif
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
789 {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
790 int retval;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
791 va_list va;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
792 #ifdef HAVE_STDARG_PROTOTYPES
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
793
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
794 va_start(va, kwlist);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
795 #else
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
796 PyObject *args;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
797 PyObject *keywords;
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
798 char *format;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
799 char **kwlist;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
800
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
801 va_start(va);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
802 args = va_arg(va, PyObject *);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
803 keywords = va_arg(va, PyObject *);
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
804 format = va_arg(va, char *);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
805 kwlist = va_arg(va, char **);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
806 #endif
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
807 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
808 va_end(va);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
809 return retval;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
810 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
811
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
812
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
813 static int
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
814 vgetargskeywords(args, keywords, format, kwlist, p_va)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
815 PyObject *args;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
816 PyObject *keywords;
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
817 char *format;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
818 char **kwlist;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
819 va_list *p_va;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
820 {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
821 char msgbuf[256];
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
822 int levels[32];
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
823 char *fname = NULL;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
824 char *message = NULL;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
825 int min = -1;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
826 int max = 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
827 char *formatsave = format;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
828 int i, len, tplen, kwlen;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
829 char *msg, *ks, **p;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
830 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
831 PyObject *key, *value;
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
832
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
833 /* 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
834
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
835 for (;;) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
836 int c = *format++;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
837 if (c == '(') {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
838 PyErr_SetString(PyExc_SystemError,
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
839 "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
840 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
841 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
842 else if (c == '\0')
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
843 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
844 else if (c == ':') {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
845 fname = format;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
846 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
847 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
848 else if (c == ';') {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
849 message = format;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
850 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
851 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
852 else if (isalpha(c))
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
853 max++;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
854 else if (c == '|')
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
855 min = max;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
856 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
857
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
858 if (min < 0)
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
859 min = max;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
860
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
861 format = formatsave;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
862
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
863 if (!PyTuple_Check(args)) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
864 PyErr_SetString(PyExc_SystemError,
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
865 "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
866 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
867 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
868
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
869 tplen = PyTuple_Size(args);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
870
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
871 /* 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
872
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
873 if (keywords) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
874 if (!PyDict_Check(keywords)) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
875 PyErr_SetString(PyExc_SystemError,
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
876 "non-dictionary object received when keyword dictionary expected");
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
877 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
878 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
879 kwlen = PyDict_Size(keywords);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
880 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
881 else {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
882 kwlen = 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
883 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
884
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
885 /* 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
886 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
887 keyword parameter in messages */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
888
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
889 if (keywords) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
890 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
891 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
892 sprintf(msgbuf,
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
893 "keyword parameter %s redefined",
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
894 kwlist[i]);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
895 PyErr_SetString(PyExc_TypeError, msgbuf);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
896 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
897 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
898 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
899 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
900 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
901
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
902 /* 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
903 arguments */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
904
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
905 len = tplen;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
906 if (keywords && tplen < min) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
907 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
908 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
909 len++;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
910 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
911 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
912 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
913 PyErr_Clear();
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
914
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
915 /* 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
916 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
917 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
918 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
919
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
920 if (len < min || max < len) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
921 if (message == NULL) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
922 sprintf(msgbuf,
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
923 "%s requires %s %d argument%s; %d given",
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
924 fname==NULL ? "function" : fname,
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
925 min==max ? "exactly"
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
926 : 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
927 len < min ? min : max,
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
928 (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
929 len);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
930 message = msgbuf;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
931 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
932 PyErr_SetString(PyExc_TypeError, message);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
933 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
934 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
935
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
936 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
937 if (*format == '|')
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
938 format++;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
939 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
940 levels, msgbuf);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
941 if (msg) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
942 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
943 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
944 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
945 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
946
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
947 /* 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
948
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
949 if (!keywords) return 1;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
950
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
951 /* 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
952 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
953
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
954 nkwds = 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
955 p = kwlist;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
956 for (;;) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
957 if (!*(p++)) break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
958 nkwds++;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
959 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
960
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
961 if (nkwds != max) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
962 PyErr_SetString(PyExc_SystemError,
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
963 "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
964 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
965 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
966
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
967 /* 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
968 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
969
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
970 converted = 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
971 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
972 PyObject *item;
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
973 if (*format == '|')
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
974 format++;
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
975 item = PyMapping_GetItemString(keywords, kwlist[i]);
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
976 if (item != NULL) {
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
977 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
978 if (msg) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
979 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
980 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
981 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
982 converted++;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
983 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
984 else {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
985 PyErr_Clear();
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
986 msg = skipitem(&format, p_va);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
987 if (msg) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
988 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
989 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
990 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
991 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
992 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
993
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
994 /* 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
995
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
996 pos = 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
997 if (converted < kwlen) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
998 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
999 match = 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1000 ks = PyString_AsString(key);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1001 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
1002 if (!strcmp(ks, kwlist[i])) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1003 match = 1;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1004 break;
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 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1007 if (!match) {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1008 sprintf(msgbuf,
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1009 "%s is an invalid keyword argument for this function",
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1010 ks);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1011 PyErr_SetString(PyExc_TypeError, msgbuf);
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1012 return 0;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1013 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1014 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1015 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1016
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1017 return 1;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1018 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1019
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1020
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1021 static char *
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1022 skipitem(p_format, p_va)
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1023 char **p_format;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1024 va_list *p_va;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1025 {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1026 char *format = *p_format;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1027 char c = *format++;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1028
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1029 switch (c) {
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 case 'b': /* byte -- very short int */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1032 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1033 (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
1034 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1035 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1036
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1037 case 'h': /* short int */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1038 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1039 (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
1040 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1041 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1042
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1043 case 'i': /* int */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1044 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1045 (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
1046 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1047 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1048
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1049 case 'l': /* long int */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1050 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1051 (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
1052 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1053 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1054
9949
98e37347378b Change rare occurrences of #if HAVE_LONG_LONG to #ifdef.
Guido van Rossum <guido@python.org>
parents: 9306
diff changeset
1055 #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
1056 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
1057 {
9044
d437b6683e24 Patch by Mark Hammond to support 64-bit ints on MS platforms.
Guido van Rossum <guido@python.org>
parents: 8822
diff changeset
1058 (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
1059 break;
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
1060 }
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
1061 #endif
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8358
diff changeset
1062
4026
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1063 case 'f': /* float */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1064 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1065 (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
1066 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1067 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1068
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1069 case 'd': /* double */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1070 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1071 (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
1072 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1073 }
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 #ifndef WITHOUT_COMPLEX
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1076 case 'D': /* complex double */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1077 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1078 (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
1079 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1080 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1081 #endif /* WITHOUT_COMPLEX */
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 case 'c': /* char */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1084 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1085 (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
1086 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1087 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1088
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1089 case 's': /* string */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1090 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1091 (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
1092 if (*format == '#') {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1093 (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
1094 format++;
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 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1097 }
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 case 'z': /* string */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1100 {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1101 (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
1102 if (*format == '#') {
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1103 (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
1104 format++;
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 break;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1107 }
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 case 'S': /* string object */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1110 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1111 (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
1112 break;
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
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1115 case 'O': /* object */
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1116 {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1117 if (*format == '!') {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1118 format++;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1119 (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
1120 (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
1121 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1122 #if 0
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1123 /* 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
1124 else if (*format == '?') {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1125 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
1126 format++;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1127 if ((*pred)(arg)) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1128 (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
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 #endif
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1132 else if (*format == '&') {
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1133 typedef int (*converter)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1134 Py_PROTO((PyObject *, void *));
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1135 (void) va_arg(*p_va, converter);
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1136 (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
1137 format++;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1138 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1139 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1140 (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
1141 }
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1142 break;
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
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1145 default:
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1146 return "impossible<bad format char>";
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1147
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
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1150 *p_format = format;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1151 return NULL;
6bbc13b7dca8 Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1152 }