rem: (void)decode_tag_number(apdu, tag_number); return decode_tag_value(apdu, value);
add: int len = 1; union { uint8_t byte[2]; uint16_t value; } short_data = { { 0}}; union { uint8_t byte[4]; uint32_t value; } long_data = { { 0}};   if (decode_is_extended_tag_number(&apdu[0])) {  if (tag_number) *tag_number = apdu[1]; len++; } else { if (tag_number) *tag_number = (apdu[0] >> 4); } if (decode_is_extended_value(&apdu[0])) {  if (apdu[len] == 255) { len++; if (big_endian()) { long_data.byte[0] = apdu[len + 0]; long_data.byte[1] = apdu[len + 1]; long_data.byte[2] = apdu[len + 2]; long_data.byte[3] = apdu[len + 3]; } else { long_data.byte[3] = apdu[len + 0]; long_data.byte[2] = apdu[len + 1]; long_data.byte[1] = apdu[len + 2]; long_data.byte[0] = apdu[len + 3]; } if (value) *value = long_data.value; len += 4;  }  else if (apdu[len] == 254) { len++; if (big_endian()) { short_data.byte[0] = apdu[len + 0]; short_data.byte[1] = apdu[len + 1]; } else { short_data.byte[1] = apdu[len + 0]; short_data.byte[0] = apdu[len + 1]; } if (value) *value = short_data.value; len += 2;  }  else { if (value) *value = apdu[len]; len++; } } else if (decode_is_opening_tag(&apdu[0]) && value) *value = 0;  else if (decode_is_closing_tag(&apdu[0]) && value) *value = 0;  else if (value) *value = apdu[0] & 0x07;  return len;
context: static int decode_tag_number_and_value(uint8_t * apdu, uint8_t * tag_number,    uint32_t * value){    (void)decode_tag_number(apdu, tag_number);    return decode_tag_value(apdu, value);}