diff Python/getargs.c @ 13872:35fc9511a36f legacy-trunk

Changed H specifier to mean "bitfield", i.e. any value from -32768..65535 is acceptable. Added B specifier (with values from -128..255). No L added (which would have completed the set) because l already accepts any value (and the letter L is taken for quadwords).
author Jack Jansen <jack.jansen@cwi.nl>
date Sat, 05 Aug 2000 21:29:58 +0000
parents 2badb322355f
children 6f6f965c5e2d
line wrap: on
line diff
--- a/Python/getargs.c	Sat Aug 05 01:31:54 2000 +0000
+++ b/Python/getargs.c	Sat Aug 05 21:29:58 2000 +0000
@@ -409,6 +409,27 @@
 			break;
 		}
 	
+	case 'B': /* byte sized bitfield - both signed and unsigned values allowed */
+		{
+			char *p = va_arg(*p_va, char *);
+			long ival = PyInt_AsLong(arg);
+			if (ival == -1 && PyErr_Occurred())
+				return "integer<b>";
+			else if (ival < SCHAR_MIN) {
+				PyErr_SetString(PyExc_OverflowError,
+			      "byte-sized integer bitfield is less than minimum");
+				return "integer<B>";
+			}
+			else if (ival > UCHAR_MAX) {
+				PyErr_SetString(PyExc_OverflowError,
+			      "byte-sized integer bitfield is greater than maximum");
+				return "integer<B>";
+			}
+			else
+				*p = (unsigned char) ival;
+			break;
+		}
+	
 	case 'h': /* signed short int */
 		{
 			short *p = va_arg(*p_va, short *);
@@ -430,20 +451,20 @@
 			break;
 		}
 	
-	case 'H': /* unsigned short int */
+	case 'H': /* short int sized bitfield, both signed and unsigned allowed */
 		{
 			unsigned short *p = va_arg(*p_va, unsigned short *);
 			long ival = PyInt_AsLong(arg);
 			if (ival == -1 && PyErr_Occurred())
 				return "integer<H>";
-			else if (ival < 0) {
+			else if (ival < SHRT_MIN) {
 				PyErr_SetString(PyExc_OverflowError,
-			      "unsigned short integer is less than minimum");
+			      "short integer bitfield is less than minimum");
 				return "integer<H>";
 			}
 			else if (ival > USHRT_MAX) {
 				PyErr_SetString(PyExc_OverflowError,
-			      "unsigned short integer is greater than maximum");
+			      "short integer bitfield is greater than maximum");
 				return "integer<H>";
 			}
 			else
@@ -1133,6 +1154,7 @@
 	switch (c) {
 	
 	case 'b': /* byte -- very short int */
+	case 'B': /* byte as bitfield */
 		{
 			(void) va_arg(*p_va, char *);
 			break;
@@ -1144,7 +1166,7 @@
 			break;
 		}
 	
-	case 'H': /* unsigned short int */
+	case 'H': /* short int as bitfield */
 		{
 			(void) va_arg(*p_va, unsigned short *);
 			break;