[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;
  	}