scanner: fix validator for bitfields

Bitfields are valid if the value only contains bits inside of
the supported entries for the given version.

Signed-off-by: Simon Ser <contact@emersion.fr>
This commit is contained in:
Simon Ser 2024-07-07 18:39:51 +02:00
parent caaa308c0d
commit c669d99259
2 changed files with 73 additions and 70 deletions

View file

@ -1391,22 +1391,35 @@ emit_validator(struct interface *interface, struct enumeration *e)
" * @ref %s_%s\n" " * @ref %s_%s\n"
" */\n" " */\n"
"static inline bool\n" "static inline bool\n"
"%s_%s_is_valid(uint32_t value, uint32_t version) {\n" "%s_%s_is_valid(uint32_t value, uint32_t version) {\n",
" switch (value) {\n",
interface->name, interface->name, e->name, interface->name, interface->name, e->name,
interface->name, e->name, interface->name, e->name,
interface->name, e->name); interface->name, e->name);
wl_list_for_each(entry, &e->entry_list, link) {
printf(" case %s%s_%s_%s:\n" if (e->bitfield) {
" return version >= %d;\n", printf(" uint32_t valid = 0;\n");
entry->value[0] == '-' ? "(uint32_t)" : "", wl_list_for_each(entry, &e->entry_list, link) {
interface->uppercase_name, e->uppercase_name, printf(" if (version >= %d)\n"
entry->uppercase_name, entry->since); " valid |= %s_%s_%s;\n",
entry->since,
interface->uppercase_name, e->uppercase_name,
entry->uppercase_name);
}
printf(" return (value & ~valid) == 0;\n");
} else {
printf(" switch (value) {\n");
wl_list_for_each(entry, &e->entry_list, link) {
printf(" case %s%s_%s_%s:\n"
" return version >= %d;\n",
entry->value[0] == '-' ? "(uint32_t)" : "",
interface->uppercase_name, e->uppercase_name,
entry->uppercase_name, entry->since);
}
printf(" default:\n"
" return false;\n"
" }\n");
} }
printf(" default:\n" printf("}\n");
" return false;\n"
" }\n"
"}\n");
} }
static void static void

View file

@ -2396,18 +2396,16 @@ enum wl_data_device_manager_dnd_action {
*/ */
static inline bool static inline bool
wl_data_device_manager_dnd_action_is_valid(uint32_t value, uint32_t version) { wl_data_device_manager_dnd_action_is_valid(uint32_t value, uint32_t version) {
switch (value) { uint32_t valid = 0;
case WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE: if (version >= 1)
return version >= 1; valid |= WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE;
case WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY: if (version >= 1)
return version >= 1; valid |= WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY;
case WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE: if (version >= 1)
return version >= 1; valid |= WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE;
case WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK: if (version >= 1)
return version >= 1; valid |= WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK;
default: return (value & ~valid) == 0;
return false;
}
} }
#endif /* WL_DATA_DEVICE_MANAGER_DND_ACTION_ENUM */ #endif /* WL_DATA_DEVICE_MANAGER_DND_ACTION_ENUM */
@ -2560,28 +2558,26 @@ enum wl_shell_surface_resize {
*/ */
static inline bool static inline bool
wl_shell_surface_resize_is_valid(uint32_t value, uint32_t version) { wl_shell_surface_resize_is_valid(uint32_t value, uint32_t version) {
switch (value) { uint32_t valid = 0;
case WL_SHELL_SURFACE_RESIZE_NONE: if (version >= 1)
return version >= 1; valid |= WL_SHELL_SURFACE_RESIZE_NONE;
case WL_SHELL_SURFACE_RESIZE_TOP: if (version >= 1)
return version >= 1; valid |= WL_SHELL_SURFACE_RESIZE_TOP;
case WL_SHELL_SURFACE_RESIZE_BOTTOM: if (version >= 1)
return version >= 1; valid |= WL_SHELL_SURFACE_RESIZE_BOTTOM;
case WL_SHELL_SURFACE_RESIZE_LEFT: if (version >= 1)
return version >= 1; valid |= WL_SHELL_SURFACE_RESIZE_LEFT;
case WL_SHELL_SURFACE_RESIZE_TOP_LEFT: if (version >= 1)
return version >= 1; valid |= WL_SHELL_SURFACE_RESIZE_TOP_LEFT;
case WL_SHELL_SURFACE_RESIZE_BOTTOM_LEFT: if (version >= 1)
return version >= 1; valid |= WL_SHELL_SURFACE_RESIZE_BOTTOM_LEFT;
case WL_SHELL_SURFACE_RESIZE_RIGHT: if (version >= 1)
return version >= 1; valid |= WL_SHELL_SURFACE_RESIZE_RIGHT;
case WL_SHELL_SURFACE_RESIZE_TOP_RIGHT: if (version >= 1)
return version >= 1; valid |= WL_SHELL_SURFACE_RESIZE_TOP_RIGHT;
case WL_SHELL_SURFACE_RESIZE_BOTTOM_RIGHT: if (version >= 1)
return version >= 1; valid |= WL_SHELL_SURFACE_RESIZE_BOTTOM_RIGHT;
default: return (value & ~valid) == 0;
return false;
}
} }
#endif /* WL_SHELL_SURFACE_RESIZE_ENUM */ #endif /* WL_SHELL_SURFACE_RESIZE_ENUM */
@ -2609,12 +2605,10 @@ enum wl_shell_surface_transient {
*/ */
static inline bool static inline bool
wl_shell_surface_transient_is_valid(uint32_t value, uint32_t version) { wl_shell_surface_transient_is_valid(uint32_t value, uint32_t version) {
switch (value) { uint32_t valid = 0;
case WL_SHELL_SURFACE_TRANSIENT_INACTIVE: if (version >= 1)
return version >= 1; valid |= WL_SHELL_SURFACE_TRANSIENT_INACTIVE;
default: return (value & ~valid) == 0;
return false;
}
} }
#endif /* WL_SHELL_SURFACE_TRANSIENT_ENUM */ #endif /* WL_SHELL_SURFACE_TRANSIENT_ENUM */
@ -3486,16 +3480,14 @@ enum wl_seat_capability {
*/ */
static inline bool static inline bool
wl_seat_capability_is_valid(uint32_t value, uint32_t version) { wl_seat_capability_is_valid(uint32_t value, uint32_t version) {
switch (value) { uint32_t valid = 0;
case WL_SEAT_CAPABILITY_POINTER: if (version >= 1)
return version >= 1; valid |= WL_SEAT_CAPABILITY_POINTER;
case WL_SEAT_CAPABILITY_KEYBOARD: if (version >= 1)
return version >= 1; valid |= WL_SEAT_CAPABILITY_KEYBOARD;
case WL_SEAT_CAPABILITY_TOUCH: if (version >= 1)
return version >= 1; valid |= WL_SEAT_CAPABILITY_TOUCH;
default: return (value & ~valid) == 0;
return false;
}
} }
#endif /* WL_SEAT_CAPABILITY_ENUM */ #endif /* WL_SEAT_CAPABILITY_ENUM */
@ -4567,14 +4559,12 @@ enum wl_output_mode {
*/ */
static inline bool static inline bool
wl_output_mode_is_valid(uint32_t value, uint32_t version) { wl_output_mode_is_valid(uint32_t value, uint32_t version) {
switch (value) { uint32_t valid = 0;
case WL_OUTPUT_MODE_CURRENT: if (version >= 1)
return version >= 1; valid |= WL_OUTPUT_MODE_CURRENT;
case WL_OUTPUT_MODE_PREFERRED: if (version >= 1)
return version >= 1; valid |= WL_OUTPUT_MODE_PREFERRED;
default: return (value & ~valid) == 0;
return false;
}
} }
#endif /* WL_OUTPUT_MODE_ENUM */ #endif /* WL_OUTPUT_MODE_ENUM */