summaryrefslogtreecommitdiffstats
path: root/libsyscalls.h
diff options
context:
space:
mode:
Diffstat (limited to 'libsyscalls.h')
-rw-r--r--libsyscalls.h25
1 files changed, 20 insertions, 5 deletions
diff --git a/libsyscalls.h b/libsyscalls.h
index 4c904b7..066de20 100644
--- a/libsyscalls.h
+++ b/libsyscalls.h
@@ -1129,8 +1129,9 @@ struct libsyscalls_datatype_description {
enum libsyscalls_datatype_section section;
/**
- * This is a ~0 terminated array describing the order
- * of the bytes the the data type
+ * This is a ~0 terminated array — but, it can also
+ * be terminated by the end of the array — describing
+ * the order of the bytes the the data type
*
* The lowest non-zero values contains the width of
* a byte (in bytes), however no such value exists
@@ -1146,8 +1147,17 @@ struct libsyscalls_datatype_description {
* there is always a value in .byteorder that is 0,
* unless .byteorder[0] is ~0
*
- * To avoid problems checking for ~0, use
- * the LIBSYSCALLS_IS_BYTEORDER_END macro
+ * To avoid problems checking for ~0, use the
+ * LIBSYSCALLS_IS_BYTEORDER_END macro; please also be
+ * aware that both the type and length can change in
+ * the future: do not assume it's `unsigned char`,
+ * and do not assume it has 32 elements, do not only
+ * `LIBSYSCALLS_IS_BYTEORDER_END` to detect ~0, but
+ * also check that no more than
+ * `sizeof(x.byteorder) / sizeof(*x.byteorder)`
+ * elements are read (where x is the instance of the
+ * structure) (you should definitely have your own
+ * macro for that one)
*/
unsigned char byteorder[32];
@@ -1160,8 +1170,13 @@ struct libsyscalls_datatype_description {
* @param SHIFT The value to test `struct libsyscalls_datatype_description.byteorder`
* @return :int Whether the value is ~0
*/
-#define LIBSYSCALLS_IS_BYTEORDER_END(SHIFT)\
+#ifdef UINTMAX_C
+# define LIBSYSCALLS_IS_BYTEORDER_END(SHIFT)\
+ (!~((SHIFT) | ~LIBSYSCALLS_FIELD_MASK_(UINTMAX_C(1), struct libsyscalls_datatype_description, byteorder[0])))
+#else
+# define LIBSYSCALLS_IS_BYTEORDER_END(SHIFT)\
(!~((SHIFT) | ~LIBSYSCALLS_FIELD_MASK_(1ULL, struct libsyscalls_datatype_description, byteorder[0])))
+#endif
};