aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2024-07-07 18:39:51 +0200
committerSimon Ser <contact@emersion.fr>2024-07-09 18:22:10 +0200
commitc669d992599d74af2762fbf71a4336af2e311c45 (patch)
tree09da580560e37a8ac8d9b5252483e4cff1a96bff /src
parentscanner: extract validator function emission to helper function (diff)
downloadwayland-c669d992599d74af2762fbf71a4336af2e311c45.tar
wayland-c669d992599d74af2762fbf71a4336af2e311c45.tar.gz
wayland-c669d992599d74af2762fbf71a4336af2e311c45.tar.bz2
wayland-c669d992599d74af2762fbf71a4336af2e311c45.tar.lz
wayland-c669d992599d74af2762fbf71a4336af2e311c45.tar.xz
wayland-c669d992599d74af2762fbf71a4336af2e311c45.tar.zst
wayland-c669d992599d74af2762fbf71a4336af2e311c45.zip
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>
Diffstat (limited to 'src')
-rw-r--r--src/scanner.c37
1 files changed, 25 insertions, 12 deletions
diff --git a/src/scanner.c b/src/scanner.c
index a4f3cc9..3cd05d1 100644
--- a/src/scanner.c
+++ b/src/scanner.c
@@ -1391,22 +1391,35 @@ emit_validator(struct interface *interface, struct enumeration *e)
" * @ref %s_%s\n"
" */\n"
"static inline bool\n"
- "%s_%s_is_valid(uint32_t value, uint32_t version) {\n"
- " switch (value) {\n",
+ "%s_%s_is_valid(uint32_t value, uint32_t version) {\n",
interface->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"
- " return version >= %d;\n",
- entry->value[0] == '-' ? "(uint32_t)" : "",
- interface->uppercase_name, e->uppercase_name,
- entry->uppercase_name, entry->since);
+
+ if (e->bitfield) {
+ printf(" uint32_t valid = 0;\n");
+ wl_list_for_each(entry, &e->entry_list, link) {
+ printf(" if (version >= %d)\n"
+ " 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"
- " return false;\n"
- " }\n"
- "}\n");
+ printf("}\n");
}
static void