[PATCH 2/5] hidparse.sys: Replace all is_*range members with a single flags member.
Rémi Bernon
rbernon at codeweavers.com
Fri Sep 17 02:18:55 CDT 2021
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/hid/hidp.c | 31 ++++++++++++++++++++-----------
dlls/hidparse.sys/main.c | 34 +++++++++++++++++-----------------
include/wine/hid.h | 8 +++++---
3 files changed, 42 insertions(+), 31 deletions(-)
diff --git a/dlls/hid/hidp.c b/dlls/hid/hidp.c
index a94e7b637ae..547f935f850 100644
--- a/dlls/hid/hidp.c
+++ b/dlls/hid/hidp.c
@@ -95,16 +95,17 @@ static NTSTATUS enum_value_caps( struct hid_preparsed_data *preparsed, HIDP_REPO
enum_value_caps_callback callback, void *user, USHORT *count )
{
const struct hid_value_caps *caps, *caps_end;
- NTSTATUS status;
- BOOL incompatible = FALSE;
+ BOOL is_range, incompatible = FALSE;
LONG remaining = *count;
+ NTSTATUS status;
for (status = get_value_caps_range( preparsed, report_type, report_len, &caps, &caps_end );
status == HIDP_STATUS_SUCCESS && caps != caps_end; caps++)
{
+ is_range = caps->flags & HID_VALUE_CAPS_IS_RANGE;
if (!match_value_caps( caps, filter )) continue;
if (filter->report_id && caps->report_id != filter->report_id) incompatible = TRUE;
- else if (filter->array && (caps->is_range || caps->report_count <= 1)) return HIDP_STATUS_NOT_VALUE_ARRAY;
+ else if (filter->array && (is_range || caps->report_count <= 1)) return HIDP_STATUS_NOT_VALUE_ARRAY;
else if (remaining-- > 0) status = callback( caps, user );
}
@@ -634,7 +635,8 @@ static NTSTATUS get_button_caps( const struct hid_value_caps *caps, void *user )
dst->BitField = caps->bit_field;
dst->IsAlias = FALSE;
dst->IsAbsolute = HID_VALUE_CAPS_IS_ABSOLUTE( caps );
- if (!(dst->IsRange = caps->is_range))
+ dst->IsRange = (caps->flags & HID_VALUE_CAPS_IS_RANGE) ? 1 : 0;
+ if (!dst->IsRange)
{
dst->NotRange.Usage = caps->usage_min;
dst->NotRange.DataIndex = caps->data_index_min;
@@ -646,14 +648,16 @@ static NTSTATUS get_button_caps( const struct hid_value_caps *caps, void *user )
dst->Range.DataIndexMin = caps->data_index_min;
dst->Range.DataIndexMax = caps->data_index_max;
}
- if (!(dst->IsStringRange = caps->is_string_range))
+ dst->IsStringRange = (caps->flags & HID_VALUE_CAPS_IS_STRING_RANGE) ? 1 : 0;
+ if (!dst->IsStringRange)
dst->NotRange.StringIndex = caps->string_min;
else
{
dst->Range.StringMin = caps->string_min;
dst->Range.StringMax = caps->string_max;
}
- if ((dst->IsDesignatorRange = caps->is_designator_range))
+ dst->IsDesignatorRange = (caps->flags & HID_VALUE_CAPS_IS_DESIGNATOR_RANGE) ? 1 : 0;
+ if (!dst->IsDesignatorRange)
dst->NotRange.DesignatorIndex = caps->designator_min;
else
{
@@ -690,33 +694,37 @@ static NTSTATUS get_value_caps( const struct hid_value_caps *caps, void *user )
dst->IsAbsolute = HID_VALUE_CAPS_IS_ABSOLUTE( caps );
dst->HasNull = HID_VALUE_CAPS_HAS_NULL( caps );
dst->BitSize = caps->bit_size;
- dst->ReportCount = caps->is_range ? 1 : caps->report_count;
dst->UnitsExp = caps->units_exp;
dst->Units = caps->units;
dst->LogicalMin = caps->logical_min;
dst->LogicalMax = caps->logical_max;
dst->PhysicalMin = caps->physical_min;
dst->PhysicalMax = caps->physical_max;
- if (!(dst->IsRange = caps->is_range))
+ dst->IsRange = (caps->flags & HID_VALUE_CAPS_IS_RANGE) ? 1 : 0;
+ if (!dst->IsRange)
{
+ dst->ReportCount = caps->report_count;
dst->NotRange.Usage = caps->usage_min;
dst->NotRange.DataIndex = caps->data_index_min;
}
else
{
+ dst->ReportCount = 1;
dst->Range.UsageMin = caps->usage_min;
dst->Range.UsageMax = caps->usage_max;
dst->Range.DataIndexMin = caps->data_index_min;
dst->Range.DataIndexMax = caps->data_index_max;
}
- if (!(dst->IsStringRange = caps->is_string_range))
+ dst->IsStringRange = (caps->flags & HID_VALUE_CAPS_IS_STRING_RANGE) ? 1 : 0;
+ if (!dst->IsStringRange)
dst->NotRange.StringIndex = caps->string_min;
else
{
dst->Range.StringMin = caps->string_min;
dst->Range.StringMax = caps->string_max;
}
- if ((dst->IsDesignatorRange = caps->is_designator_range))
+ dst->IsDesignatorRange = (caps->flags & HID_VALUE_CAPS_IS_DESIGNATOR_RANGE) ? 1 : 0;
+ if (!dst->IsDesignatorRange)
dst->NotRange.DesignatorIndex = caps->designator_min;
else
{
@@ -810,7 +818,8 @@ NTSTATUS WINAPI HidP_GetUsagesEx( HIDP_REPORT_TYPE report_type, USHORT collectio
static NTSTATUS count_data( const struct hid_value_caps *caps, void *user )
{
- if (caps->is_range || HID_VALUE_CAPS_IS_BUTTON( caps )) *(ULONG *)user += caps->report_count;
+ BOOL is_range = caps->flags & HID_VALUE_CAPS_IS_RANGE;
+ if (is_range || HID_VALUE_CAPS_IS_BUTTON( caps )) *(ULONG *)user += caps->report_count;
else *(ULONG *)user += 1;
return HIDP_STATUS_SUCCESS;
}
diff --git a/dlls/hidparse.sys/main.c b/dlls/hidparse.sys/main.c
index b7326f9fe4a..73b9858f741 100644
--- a/dlls/hidparse.sys/main.c
+++ b/dlls/hidparse.sys/main.c
@@ -102,11 +102,11 @@ enum
static inline const char *debugstr_hid_value_caps( struct hid_value_caps *caps )
{
if (!caps) return "(null)";
- return wine_dbg_sprintf( "RId %d, Usg %02x:%02x-%02x Dat %02x-%02x (%d), Str %d-%d (%d), Des %d-%d (%d), "
- "Bits %02x, LCol %d LUsg %02x:%02x, BitSz %d, RCnt %d, Unit %x E%+d, Log %+d-%+d, Phy %+d-%+d",
- caps->report_id, caps->usage_page, caps->usage_min, caps->usage_max, caps->data_index_min, caps->data_index_max, caps->is_range,
- caps->string_min, caps->string_max, caps->is_string_range, caps->designator_min, caps->designator_max, caps->is_designator_range,
- caps->bit_field, caps->link_collection, caps->link_usage_page, caps->link_usage, caps->bit_size, caps->report_count,
+ return wine_dbg_sprintf( "RId %d, Usg %02x:%02x-%02x Dat %02x-%02x, Str %d-%d, Des %d-%d, "
+ "Bits %02x Flags %#x, LCol %d LUsg %02x:%02x, BitSz %d, RCnt %d, Unit %x E%+d, Log %+d-%+d, Phy %+d-%+d",
+ caps->report_id, caps->usage_page, caps->usage_min, caps->usage_max, caps->data_index_min, caps->data_index_max,
+ caps->string_min, caps->string_max, caps->designator_min, caps->designator_max, caps->bit_field, caps->flags,
+ caps->link_collection, caps->link_usage_page, caps->link_usage, caps->bit_size, caps->report_count,
caps->units, caps->units_exp, caps->logical_min, caps->logical_max, caps->physical_min, caps->physical_max );
}
@@ -243,13 +243,13 @@ static BOOL parse_global_pop( struct hid_parser_state *state )
static BOOL parse_local_usage( struct hid_parser_state *state, USAGE usage_page, USAGE usage )
{
if (!usage_page) usage_page = state->items.usage_page;
- if (state->items.is_range) state->usages_size = 0;
+ if (state->items.flags & HID_VALUE_CAPS_IS_RANGE) state->usages_size = 0;
state->usages_page[state->usages_size] = usage_page;
state->usages_min[state->usages_size] = usage;
state->usages_max[state->usages_size] = usage;
state->items.usage_min = usage;
state->items.usage_max = usage;
- state->items.is_range = FALSE;
+ state->items.flags &= ~HID_VALUE_CAPS_IS_RANGE;
if (state->usages_size++ == 255) ERR( "HID parser usages stack overflow!\n" );
return state->usages_size <= 255;
}
@@ -257,22 +257,22 @@ static BOOL parse_local_usage( struct hid_parser_state *state, USAGE usage_page,
static void parse_local_usage_min( struct hid_parser_state *state, USAGE usage_page, USAGE usage )
{
if (!usage_page) usage_page = state->items.usage_page;
- if (!state->items.is_range) state->usages_max[0] = 0;
+ if (!(state->items.flags & HID_VALUE_CAPS_IS_RANGE)) state->usages_max[0] = 0;
state->usages_page[0] = usage_page;
state->usages_min[0] = usage;
state->items.usage_min = usage;
- state->items.is_range = TRUE;
+ state->items.flags |= HID_VALUE_CAPS_IS_RANGE;
state->usages_size = 1;
}
static void parse_local_usage_max( struct hid_parser_state *state, USAGE usage_page, USAGE usage )
{
if (!usage_page) usage_page = state->items.usage_page;
- if (!state->items.is_range) state->usages_min[0] = 0;
+ if (!(state->items.flags & HID_VALUE_CAPS_IS_RANGE)) state->usages_min[0] = 0;
state->usages_page[0] = usage_page;
state->usages_max[0] = usage;
state->items.usage_max = usage;
- state->items.is_range = TRUE;
+ state->items.flags |= HID_VALUE_CAPS_IS_RANGE;
state->usages_size = 1;
}
@@ -579,27 +579,27 @@ struct hid_preparsed_data *parse_descriptor( BYTE *descriptor, unsigned int leng
break;
case SHORT_ITEM( TAG_LOCAL_DESIGNATOR_INDEX, TAG_TYPE_LOCAL ):
state->items.designator_min = state->items.designator_max = value;
- state->items.is_designator_range = FALSE;
+ state->items.flags &= ~HID_VALUE_CAPS_IS_DESIGNATOR_RANGE;
break;
case SHORT_ITEM( TAG_LOCAL_DESIGNATOR_MINIMUM, TAG_TYPE_LOCAL ):
state->items.designator_min = value;
- state->items.is_designator_range = TRUE;
+ state->items.flags |= HID_VALUE_CAPS_IS_DESIGNATOR_RANGE;
break;
case SHORT_ITEM( TAG_LOCAL_DESIGNATOR_MAXIMUM, TAG_TYPE_LOCAL ):
state->items.designator_max = value;
- state->items.is_designator_range = TRUE;
+ state->items.flags |= HID_VALUE_CAPS_IS_DESIGNATOR_RANGE;
break;
case SHORT_ITEM( TAG_LOCAL_STRING_INDEX, TAG_TYPE_LOCAL ):
state->items.string_min = state->items.string_max = value;
- state->items.is_string_range = FALSE;
+ state->items.flags &= ~HID_VALUE_CAPS_IS_STRING_RANGE;
break;
case SHORT_ITEM( TAG_LOCAL_STRING_MINIMUM, TAG_TYPE_LOCAL ):
state->items.string_min = value;
- state->items.is_string_range = TRUE;
+ state->items.flags |= HID_VALUE_CAPS_IS_STRING_RANGE;
break;
case SHORT_ITEM( TAG_LOCAL_STRING_MAXIMUM, TAG_TYPE_LOCAL ):
state->items.string_max = value;
- state->items.is_string_range = TRUE;
+ state->items.flags |= HID_VALUE_CAPS_IS_STRING_RANGE;
break;
case SHORT_ITEM( TAG_LOCAL_DELIMITER, TAG_TYPE_LOCAL ):
FIXME( "delimiter %d not implemented!\n", value );
diff --git a/include/wine/hid.h b/include/wine/hid.h
index 8e33745ddc4..4f388404885 100644
--- a/include/wine/hid.h
+++ b/include/wine/hid.h
@@ -42,9 +42,7 @@ struct hid_value_caps
USHORT string_max;
USHORT designator_min;
USHORT designator_max;
- BOOLEAN is_range;
- BOOLEAN is_string_range;
- BOOLEAN is_designator_range;
+ ULONG flags;
UCHAR report_id;
USHORT link_collection;
USAGE link_usage_page;
@@ -63,6 +61,10 @@ struct hid_value_caps
ULONG units_exp;
};
+#define HID_VALUE_CAPS_IS_RANGE 0x10
+#define HID_VALUE_CAPS_IS_STRING_RANGE 0x40
+#define HID_VALUE_CAPS_IS_DESIGNATOR_RANGE 0x80
+
#define HID_VALUE_CAPS_IS_ABSOLUTE(x) (((x)->bit_field & 0x04) == 0)
#define HID_VALUE_CAPS_HAS_NULL(x) (((x)->bit_field & 0x40) != 0)
#define HID_VALUE_CAPS_IS_ARRAY(c) (((c)->bit_field & 2) == 0)
--
2.33.0
More information about the wine-devel
mailing list