Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit cc22fbe

Browse files
committed
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).
1 parent ab3a0f3 commit cc22fbe

1 file changed

Lines changed: 27 additions & 5 deletions

File tree

Python/getargs.c

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)