[Python-checkins] python/dist/src/Python getargs.c,2.97,2.98
theller@users.sourceforge.net
theller@users.sourceforge.net
Thu, 17 Apr 2003 11:55:48 -0700
Update of /cvsroot/python/python/dist/src/Python
In directory sc8-pr-cvs1:/tmp/cvs-serv7184
Modified Files:
getargs.c
Log Message:
SF # 595026: support for masks in getargs.c.
New functions:
unsigned long PyInt_AsUnsignedLongMask(PyObject *);
unsigned PY_LONG_LONG) PyInt_AsUnsignedLongLongMask(PyObject *);
unsigned long PyLong_AsUnsignedLongMask(PyObject *);
unsigned PY_LONG_LONG) PyLong_AsUnsignedLongLongMask(PyObject *);
New and changed format codes:
b unsigned char 0..UCHAR_MAX
B unsigned char none **
h unsigned short 0..USHRT_MAX
H unsigned short none **
i int INT_MIN..INT_MAX
I * unsigned int 0..UINT_MAX
l long LONG_MIN..LONG_MAX
k * unsigned long none
L long long LLONG_MIN..LLONG_MAX
K * unsigned long long none
Notes:
* New format codes.
** Changed from previous "range-and-a-half" to "none"; the
range-and-a-half checking wasn't particularly useful.
New test test_getargs2.py, to verify all this.
Index: getargs.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/getargs.c,v
retrieving revision 2.97
retrieving revision 2.98
diff -C2 -d -r2.97 -r2.98
*** getargs.c 29 Mar 2003 10:04:55 -0000 2.97
--- getargs.c 17 Apr 2003 18:55:45 -0000 2.98
***************
*** 449,465 ****
if (float_argument_error(arg))
return NULL;
! ival = PyInt_AsLong(arg);
if (ival == -1 && PyErr_Occurred())
- return converterr("integer<b>", arg, msgbuf, bufsize);
- else if (ival < SCHAR_MIN) {
- PyErr_SetString(PyExc_OverflowError,
- "byte-sized integer bitfield is less than minimum");
return converterr("integer<B>", arg, msgbuf, bufsize);
- }
- else if (ival > (int)UCHAR_MAX) {
- PyErr_SetString(PyExc_OverflowError,
- "byte-sized integer bitfield is greater than maximum");
- return converterr("integer<B>", arg, msgbuf, bufsize);
- }
else
*p = (unsigned char) ival;
--- 449,455 ----
if (float_argument_error(arg))
return NULL;
! ival = PyInt_AsUnsignedLongMask(arg);
if (ival == -1 && PyErr_Occurred())
return converterr("integer<B>", arg, msgbuf, bufsize);
else
*p = (unsigned char) ival;
***************
*** 467,471 ****
}
! case 'h': {/* signed short int */
short *p = va_arg(*p_va, short *);
long ival;
--- 457,461 ----
}
! case 'h': {/* unsigned short int */
short *p = va_arg(*p_va, short *);
long ival;
***************
*** 475,486 ****
if (ival == -1 && PyErr_Occurred())
return converterr("integer<h>", arg, msgbuf, bufsize);
! else if (ival < SHRT_MIN) {
PyErr_SetString(PyExc_OverflowError,
! "signed short integer is less than minimum");
return converterr("integer<h>", arg, msgbuf, bufsize);
}
! else if (ival > SHRT_MAX) {
PyErr_SetString(PyExc_OverflowError,
! "signed short integer is greater than maximum");
return converterr("integer<h>", arg, msgbuf, bufsize);
}
--- 465,476 ----
if (ival == -1 && PyErr_Occurred())
return converterr("integer<h>", arg, msgbuf, bufsize);
! else if (ival < 0) {
PyErr_SetString(PyExc_OverflowError,
! "unsigned short integer is less than minimum");
return converterr("integer<h>", arg, msgbuf, bufsize);
}
! else if (ival > USHRT_MAX) {
PyErr_SetString(PyExc_OverflowError,
! "unsigned short integer is greater than maximum");
return converterr("integer<h>", arg, msgbuf, bufsize);
}
***************
*** 496,512 ****
if (float_argument_error(arg))
return NULL;
! ival = PyInt_AsLong(arg);
if (ival == -1 && PyErr_Occurred())
return converterr("integer<H>", arg, msgbuf, bufsize);
- else if (ival < SHRT_MIN) {
- PyErr_SetString(PyExc_OverflowError,
- "short integer bitfield is less than minimum");
- return converterr("integer<H>", arg, msgbuf, bufsize);
- }
- else if (ival > USHRT_MAX) {
- PyErr_SetString(PyExc_OverflowError,
- "short integer bitfield is greater than maximum");
- return converterr("integer<H>", arg, msgbuf, bufsize);
- }
else
*p = (unsigned short) ival;
--- 486,492 ----
if (float_argument_error(arg))
return NULL;
! ival = PyInt_AsUnsignedLongMask(arg);
if (ival == -1 && PyErr_Occurred())
return converterr("integer<H>", arg, msgbuf, bufsize);
else
*p = (unsigned short) ival;
***************
*** 537,540 ****
--- 517,534 ----
}
+ case 'I': { /* int sized bitfield, both signed and
+ unsigned allowed */
+ unsigned int *p = va_arg(*p_va, unsigned int *);
+ unsigned int ival;
+ if (float_argument_error(arg))
+ return NULL;
+ ival = PyInt_AsUnsignedLongMask(arg);
+ if (ival == -1 && PyErr_Occurred())
+ return converterr("integer<I>", arg, msgbuf, bufsize);
+ else
+ *p = ival;
+ break;
+ }
+
case 'l': {/* long int */
long *p = va_arg(*p_va, long *);
***************
*** 549,552 ****
--- 543,559 ----
break;
}
+
+ case 'k': { /* long sized bitfield */
+ unsigned long *p = va_arg(*p_va, unsigned long *);
+ unsigned long ival;
+ if (PyInt_Check(arg))
+ ival = PyInt_AsUnsignedLongMask(arg);
+ else if (PyLong_Check(arg))
+ ival = PyLong_AsUnsignedLongMask(arg);
+ else
+ return converterr("integer<k>", arg, msgbuf, bufsize);
+ *p = ival;
+ break;
+ }
#ifdef HAVE_LONG_LONG
***************
*** 559,562 ****
--- 566,584 ----
*p = ival;
}
+ break;
+ }
+
+ case 'K': { /* long long sized bitfield */
+ unsigned PY_LONG_LONG *p = va_arg(*p_va, unsigned PY_LONG_LONG *);
+ unsigned PY_LONG_LONG ival;
+ if (float_argument_error(arg))
+ return NULL;
+ if (PyInt_Check(arg))
+ ival = PyInt_AsUnsignedLongMask(arg);
+ else if (PyLong_Check(arg))
+ ival = PyLong_AsUnsignedLongLongMask(arg);
+ else
+ return converterr("integer<K>", arg, msgbuf, bufsize);
+ *p = ival;
break;
}