} test_enum_flags;
ENUM_FLAGS(test_enum_flags_names, FLAG1, FLAG5,
- "FLAG1", "FLAG2", "FLAG3", "FLAG4", "FLAG5");
+ "(unset)", "FLAG1", "FLAG2", "FLAG3", "FLAG4", "FLAG5");
ENUM_FLAGS(test_enum_flags_incomplete_names, FLAG3, FLAG4,
- "FLAG3", "FLAG4");
+ "(unset)", "FLAG3", "FLAG4");
ENUM_FLAGS(test_enum_flags_null_names, FLAG1, FLAG4,
- "FLAG1", NULL, "FLAG3", NULL);
+ "(unset)", "FLAG1", NULL, "FLAG3", NULL);
-ENUM_FLAGS(test_enum_flags_overflow_names, FLAG1, FLAG12,
+ENUM_FLAGS(test_enum_flags_overflow_names, FLAG1, FLAG12, "(unset)",
"OVERFLOWFLAGLONGNAME1", "OVERFLOWFLAGLONGNAME2", "OVERFLOWFLAGLONGNAME3",
"OVERFLOWFLAGLONGNAME4", "OVERFLOWFLAGLONGNAME5", "OVERFLOWFLAGLONGNAME6",
"OVERFLOWFLAGLONGNAME7", "OVERFLOWFLAGLONGNAME8", "OVERFLOWFLAGLONGNAME9",
/**
* Get the position of a flag name using offset calculation
*/
-static int find_flag_pos(u_int val, u_int first)
+static int find_flag_pos(u_int first, u_int val)
{
int offset = 0;
- while (val != 0x01)
+ while (first != 0x01)
{
- val = val >> 1;
+ first = first >> 1;
offset++;
}
- return first - offset;
+ /* skip the first name as that's used if no flag is set */
+ return 1 + val - offset;
}
/**
return buf;
}
- if (snprintf(buf, len, "(unset)") >= len)
+ if (snprintf(buf, len, e->names[0]) >= len)
{
return NULL;
}
* @param name name of the enum_name list
* @param first enum value of the first enum string
* @param last enum value of the last enum string
+ * @param unset name used if no flags are set
* @param ... a list of strings
*/
-#define ENUM_FLAGS(name, first, last, ...) \
+#define ENUM_FLAGS(name, first, last, unset, ...) \
static enum_name_t name##last = {first, last + \
BUILD_ASSERT((__builtin_ffs(last)-__builtin_ffs(first)+1) == \
countof(((char*[]){__VA_ARGS__}))), \
- ENUM_FLAG_MAGIC, { __VA_ARGS__ }}; ENUM_END(name, last)
+ ENUM_FLAG_MAGIC, { unset, __VA_ARGS__ }}; ENUM_END(name, last)
/**
* Convert a enum value to its string representation.