📄 getargs.c
字号:
"short integer bitfield is greater than maximum");
return converterr("integer<H>", arg, msgbuf, bufsize);
}
else
*p = (unsigned short) ival;
break;
}
case 'i': {/* signed int */
int *p = va_arg((*p_va), int *);
long ival = PyInt_AsLong(arg);
if (ival == -1 && PyErr_Occurred())
return converterr("integer<i>", arg, msgbuf, bufsize);
else if (ival > INT_MAX) {
PyErr_SetString(PyExc_OverflowError,
"signed integer is greater than maximum");
return converterr("integer<i>", arg, msgbuf, bufsize);
}
else if (ival < INT_MIN) {
PyErr_SetString(PyExc_OverflowError,
"signed integer is less than minimum");
return converterr("integer<i>", arg, msgbuf, bufsize);
}
else
*p = ival;
break;
}
case 'l': {/* long int */
long *p = va_arg((*p_va), long *);
long ival = PyInt_AsLong(arg);
if (ival == -1 && PyErr_Occurred())
return converterr("integer<l>", arg, msgbuf, bufsize);
else
*p = ival;
break;
}
#ifdef HAVE_LONG_LONG
case 'L': {/* LONG_LONG */
LONG_LONG *p = va_arg( (*p_va), LONG_LONG * );
LONG_LONG ival = PyLong_AsLongLong( arg );
if( ival == (LONG_LONG)-1 && PyErr_Occurred() ) {
return converterr("long<L>", arg, msgbuf, bufsize);
} else {
*p = ival;
}
break;
}
#endif
case 'f': {/* float */
float *p = va_arg((*p_va), float *);
double dval = PyFloat_AsDouble(arg);
if (PyErr_Occurred())
return converterr("float<f>", arg, msgbuf, bufsize);
else
*p = (float) dval;
break;
}
case 'd': {/* double */
double *p = va_arg((*p_va), double *);
double dval = PyFloat_AsDouble(arg);
if (PyErr_Occurred())
return converterr("float<d>", arg, msgbuf, bufsize);
else
*p = dval;
break;
}
#ifndef WITHOUT_COMPLEX
case 'D': {/* complex double */
Py_complex *p = va_arg((*p_va), Py_complex *);
Py_complex cval;
cval = PyComplex_AsCComplex(arg);
if (PyErr_Occurred())
return converterr("complex<D>", arg, msgbuf, bufsize);
else
*p = cval;
break;
}
#endif /* WITHOUT_COMPLEX */
case 'c': {/* char */
char *p = va_arg((*p_va), char *);
if (PyString_Check(arg) && PyString_Size(arg) == 1)
*p = PyString_AS_STRING(arg)[0];
else
return converterr("char", arg, msgbuf, bufsize);
break;
}
case 's': {/* string */
if (*format == '#') {
void **p = (void **)va_arg((*p_va), char **);
int *q = va_arg((*p_va), int *);
if (PyString_Check(arg)) {
*p = PyString_AS_STRING(arg);
*q = PyString_GET_SIZE(arg);
}
#ifdef Py_USING_UNICODE
else if (PyUnicode_Check(arg)) {
uarg = UNICODE_DEFAULT_ENCODING(arg);
if (uarg == NULL)
return converterr(CONV_UNICODE,
arg, msgbuf, bufsize);
*p = PyString_AS_STRING(uarg);
*q = PyString_GET_SIZE(uarg);
}
#endif
else { /* any buffer-like object */
char *buf;
int count = convertbuffer(arg, p, &buf);
if (count < 0)
return converterr(buf, arg, msgbuf, bufsize);
*q = count;
}
format++;
} else {
char **p = va_arg((*p_va), char **);
if (PyString_Check(arg))
*p = PyString_AS_STRING(arg);
#ifdef Py_USING_UNICODE
else if (PyUnicode_Check(arg)) {
uarg = UNICODE_DEFAULT_ENCODING(arg);
if (uarg == NULL)
return converterr(CONV_UNICODE,
arg, msgbuf, bufsize);
*p = PyString_AS_STRING(uarg);
}
#endif
else
return converterr("string", arg, msgbuf, bufsize);
if ((int)strlen(*p) != PyString_Size(arg))
return converterr("string without null bytes",
arg, msgbuf, bufsize);
}
break;
}
case 'z': {/* string, may be NULL (None) */
if (*format == '#') { /* any buffer-like object */
void **p = (void **)va_arg((*p_va), char **);
int *q = va_arg((*p_va), int *);
if (arg == Py_None) {
*p = 0;
*q = 0;
}
else if (PyString_Check(arg)) {
*p = PyString_AS_STRING(arg);
*q = PyString_GET_SIZE(arg);
}
#ifdef Py_USING_UNICODE
else if (PyUnicode_Check(arg)) {
uarg = UNICODE_DEFAULT_ENCODING(arg);
if (uarg == NULL)
return converterr(CONV_UNICODE,
arg, msgbuf, bufsize);
*p = PyString_AS_STRING(uarg);
*q = PyString_GET_SIZE(uarg);
}
#endif
else { /* any buffer-like object */
char *buf;
int count = convertbuffer(arg, p, &buf);
if (count < 0)
return converterr(buf, arg, msgbuf, bufsize);
*q = count;
}
format++;
} else {
char **p = va_arg((*p_va), char **);
if (arg == Py_None)
*p = 0;
else if (PyString_Check(arg))
*p = PyString_AS_STRING(arg);
#ifdef Py_USING_UNICODE
else if (PyUnicode_Check(arg)) {
uarg = UNICODE_DEFAULT_ENCODING(arg);
if (uarg == NULL)
return converterr(CONV_UNICODE,
arg, msgbuf, bufsize);
*p = PyString_AS_STRING(uarg);
}
#endif
else
return converterr("string or None",
arg, msgbuf, bufsize);
if (*format == '#') {
int *q = va_arg((*p_va), int *);
if (arg == Py_None)
*q = 0;
else
*q = PyString_Size(arg);
format++;
}
else if (*p != NULL &&
(int)strlen(*p) != PyString_Size(arg))
return converterr(
"string without null bytes or None",
arg, msgbuf, bufsize);
}
break;
}
case 'e': {/* encoded string */
char **buffer;
const char *encoding;
PyObject *s;
int size, recode_strings;
/* Get 'e' parameter: the encoding name */
encoding = (const char *)va_arg((*p_va), const char *);
#ifdef Py_USING_UNICODE
if (encoding == NULL)
encoding = PyUnicode_GetDefaultEncoding();
#endif
/* Get output buffer parameter:
's' (recode all objects via Unicode) or
't' (only recode non-string objects)
*/
if (*format == 's')
recode_strings = 1;
else if (*format == 't')
recode_strings = 0;
else
return converterr(
"(unknown parser marker combination)",
arg, msgbuf, bufsize);
buffer = (char **)va_arg((*p_va), char **);
format++;
if (buffer == NULL)
return converterr("(buffer is NULL)",
arg, msgbuf, bufsize);
/* Encode object */
if (!recode_strings && PyString_Check(arg)) {
s = arg;
Py_INCREF(s);
}
else {
#ifdef Py_USING_UNICODE
PyObject *u;
/* Convert object to Unicode */
u = PyUnicode_FromObject(arg);
if (u == NULL)
return converterr(
"string or unicode or text buffer",
arg, msgbuf, bufsize);
/* Encode object; use default error handling */
s = PyUnicode_AsEncodedString(u,
encoding,
NULL);
Py_DECREF(u);
if (s == NULL)
return converterr("(encoding failed)",
arg, msgbuf, bufsize);
if (!PyString_Check(s)) {
Py_DECREF(s);
return converterr(
"(encoder failed to return a string)",
arg, msgbuf, bufsize);
}
#else
return converterr("string<e>", arg, msgbuf, bufsize);
#endif
}
size = PyString_GET_SIZE(s);
/* Write output; output is guaranteed to be 0-terminated */
if (*format == '#') {
/* Using buffer length parameter '#':
- if *buffer is NULL, a new buffer of the
needed size is allocated and the data
copied into it; *buffer is updated to point
to the new buffer; the caller is
responsible for PyMem_Free()ing it after
usage
- if *buffer is not NULL, the data is
copied to *buffer; *buffer_len has to be
set to the size of the buffer on input;
buffer overflow is signalled with an error;
buffer has to provide enough room for the
encoded string plus the trailing 0-byte
- in both cases, *buffer_len is updated to
the size of the buffer /excluding/ the
trailing 0-byte
*/
int *buffer_len = va_arg((*p_va), int *);
format++;
if (buffer_len == NULL)
return converterr(
"(buffer_len is NULL)",
arg, msgbuf, bufsize);
if (*buffer == NULL) {
*buffer = PyMem_NEW(char, size + 1);
if (*buffer == NULL) {
Py_DECREF(s);
return converterr(
"(memory error)",
arg, msgbuf, bufsize);
}
} else {
if (size + 1 > *buffer_len) {
Py_DECREF(s);
return converterr(
"(buffer overflow)",
arg, msgbuf, bufsize);
}
}
memcpy(*buffer,
PyString_AS_STRING(s),
size + 1);
*buffer_len = size;
} else {
/* Using a 0-terminated buffer:
- the encoded string has to be 0-terminated
for this variant to work; if it is not, an
error raised
- a new buffer of the needed size is
allocated and the data copied into it;
*buffer is updated to point to the new
buffer; the caller is responsible for
PyMem_Free()ing it after usage
*/
if ((int)strlen(PyString_AS_STRING(s)) != size)
return converterr(
"(encoded string without NULL bytes)",
arg, msgbuf, bufsize);
*buffer = PyMem_NEW(char, size + 1);
if (*buffer == NULL) {
Py_DECREF(s);
return converterr("(memory error)",
arg, msgbuf, bufsize);
}
memcpy(*buffer,
PyString_AS_STRING(s),
size + 1);
}
Py_DECREF(s);
break;
}
#ifdef Py_USING_UNICODE
case 'u': {/* raw unicode buffer (Py_UNICODE *) */
if (*format == '#') { /* any buffer-like object */
void **p = (void **)va_arg((*p_va), char **);
int *q = va_arg((*p_va), int *);
char *buf;
int count = convertbuffer(arg, p, &buf);
if (count < 0)
return converterr(buf, arg, msgbuf, bufsize);
*q = count/(sizeof(Py_UNICODE));
format++;
} else {
Py_UNICODE **p = va_arg((*p_va), Py_UNICODE **);
if (PyUnicode_Check(arg))
*p = PyUnicode_AS_UNICODE(arg);
else
return converterr("unicode", arg, msgbuf, bufsize);
}
break;
}
#endif
case 'S': { /* string object */
PyObject **p = va_arg((*p_va), PyObject **);
if (PyString_Check(arg))
*p = arg;
else
return converterr("string", arg, msgbuf, bufsize);
break;
}
#ifdef Py_USING_UNICODE
case 'U': { /* Unicode object */
PyObject **p = va_arg((*p_va), PyObject **);
if (PyUnicode_Check(arg))
*p = arg;
else
return converterr("unicode", arg, msgbuf, bufsize);
break;
}
#endif
case 'O': { /* object */
PyTypeObject *type;
PyObject **p;
if (*format == '!') {
type = va_arg((*p_va), PyTypeObject*);
p = va_arg((*p_va), PyObject **);
format++;
if (PyType_IsSubtype(arg->ob_type, type))
*p = arg;
else
return converterr(type->tp_name, arg, msgbuf, bufsize);
}
else if (*format == '?') {
inquiry pred = va_arg((*p_va), inquiry);
p = va_arg((*p_va), PyObject **);
format++;
if ((*pred)(arg))
*p = arg;
else
return converterr("(unspecified)",
arg, msgbuf, bufsize);
}
else if (*format == '&') {
typedef int (*converter)(PyObject *, void *);
converter convert = va_arg((*p_va), converter);
void *addr = va_arg((*p_va), void *);
format++;
if (! (*convert)(arg, addr))
return converterr("(unspecified)",
arg, msgbuf, bufsize);
}
else {
p = va_arg((*p_va), PyObject **);
*p = arg;
}
break;
}
case 'w': { /* memory buffer, read-write access */
void **p = va_arg((*p_va), void **);
// XXX:CW32
PyBufferProcs *pb = (PyBufferProcs *)arg->ob_type->tp_as_buffer;
int count;
if (pb == NULL ||
pb->bf_getwritebuffer == NULL ||
pb->bf_getsegcount == NULL)
return converterr("read-write buffer", arg, msgbuf, bufsize);
if ((*pb->bf_getsegcount)(arg, NULL) != 1)
return converterr("single-segment read-write buffer",
arg, msgbuf, bufsize);
if ((count = pb->bf_getwritebuffer(arg, 0, p)) < 0)
return converterr("(unspecified)", arg, msgbuf, bufsize);
if (*format == '#') {
int *q = va_arg((*p_va), int *);
*q = count;
format++;
}
break;
}
case 't': { /* 8-bit character buffer, read-only access */
const char **p = va_arg((*p_va), const char **);
// XXX:CW32
PyBufferProcs *pb = (PyBufferProcs *)arg->ob_type->tp_as_buffer;
int count;
if (*format++ != '#')
return converterr(
"invalid use of 't' format character",
arg, msgbuf, bufsize);
if (!PyType_HasFeature(arg->ob_type,
Py_TPFLAGS_HAVE_GETCHARBUFFER) ||
pb == NULL || pb->bf_getcharbuffer == NULL ||
pb->bf_getsegcount == NULL)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -