@@ -409,6 +409,27 @@ convertsimple1(PyObject *arg, char **p_format, va_list *p_va)
409409 break ;
410410 }
411411
412+ case 'B' : /* byte sized bitfield - both signed and unsigned values allowed */
413+ {
414+ char * p = va_arg (* p_va , char * );
415+ long ival = PyInt_AsLong (arg );
416+ if (ival == -1 && PyErr_Occurred ())
417+ return "integer<b>" ;
418+ else if (ival < SCHAR_MIN ) {
419+ PyErr_SetString (PyExc_OverflowError ,
420+ "byte-sized integer bitfield is less than minimum" );
421+ return "integer<B>" ;
422+ }
423+ else if (ival > UCHAR_MAX ) {
424+ PyErr_SetString (PyExc_OverflowError ,
425+ "byte-sized integer bitfield is greater than maximum" );
426+ return "integer<B>" ;
427+ }
428+ else
429+ * p = (unsigned char ) ival ;
430+ break ;
431+ }
432+
412433 case 'h' : /* signed short int */
413434 {
414435 short * p = va_arg (* p_va , short * );
@@ -430,20 +451,20 @@ convertsimple1(PyObject *arg, char **p_format, va_list *p_va)
430451 break ;
431452 }
432453
433- case 'H' : /* unsigned short int */
454+ case 'H' : /* short int sized bitfield, both signed and unsigned allowed */
434455 {
435456 unsigned short * p = va_arg (* p_va , unsigned short * );
436457 long ival = PyInt_AsLong (arg );
437458 if (ival == -1 && PyErr_Occurred ())
438459 return "integer<H>" ;
439- else if (ival < 0 ) {
460+ else if (ival < SHRT_MIN ) {
440461 PyErr_SetString (PyExc_OverflowError ,
441- "unsigned short integer is less than minimum" );
462+ "short integer bitfield is less than minimum" );
442463 return "integer<H>" ;
443464 }
444465 else if (ival > USHRT_MAX ) {
445466 PyErr_SetString (PyExc_OverflowError ,
446- "unsigned short integer is greater than maximum" );
467+ "short integer bitfield is greater than maximum" );
447468 return "integer<H>" ;
448469 }
449470 else
@@ -1133,6 +1154,7 @@ skipitem(char **p_format, va_list *p_va)
11331154 switch (c ) {
11341155
11351156 case 'b' : /* byte -- very short int */
1157+ case 'B' : /* byte as bitfield */
11361158 {
11371159 (void ) va_arg (* p_va , char * );
11381160 break ;
@@ -1144,7 +1166,7 @@ skipitem(char **p_format, va_list *p_va)
11441166 break ;
11451167 }
11461168
1147- case 'H' : /* unsigned short int */
1169+ case 'H' : /* short int as bitfield */
11481170 {
11491171 (void ) va_arg (* p_va , unsigned short * );
11501172 break ;
0 commit comments