#ifndef _WIMLIB_TYPES_H
#define _WIMLIB_TYPES_H
-#include "wimlib_tchar.h"
-
#include <inttypes.h>
#include <stdbool.h>
#include <stddef.h>
+#include "wimlib_tchar.h"
+#include "wimlib/compiler.h"
+
#ifndef _NTFS_TYPES_H
/* Unsigned integer types of exact size in bits */
typedef uint8_t u8;
typedef int64_t s64;
/* Unsigned little endian types of exact size */
-typedef uint8_t le8;
-typedef uint16_t le16;
-typedef uint32_t le32;
-typedef uint64_t le64;
+typedef uint16_t _bitwise_attr le16;
+typedef uint32_t _bitwise_attr le32;
+typedef uint64_t _bitwise_attr le64;
/* Signed little endian types of exact size (declare as unsigned to avoid sign
* extension on big-endian architectures) */
-typedef uint8_t sle8;
-typedef uint16_t sle16;
-typedef uint32_t sle32;
-typedef uint64_t sle64;
+typedef uint16_t _bitwise_attr sle16;
+typedef uint32_t _bitwise_attr sle32;
+typedef uint64_t _bitwise_attr sle64;
+
+/* Unsigned big endian types of exact size */
+typedef uint16_t _bitwise_attr be16;
+typedef uint32_t _bitwise_attr be32;
+typedef uint64_t _bitwise_attr be64;
+
#endif
/* A pointer to 'utf16lechar' indicates a UTF-16LE encoded string */
-typedef u16 utf16lechar;
+typedef le16 utf16lechar;
#ifndef WIMLIB_WIMSTRUCT_DECLARED
typedef struct WIMStruct WIMStruct;
# define WIMLIB_WIMSTRUCT_DECLARED
#endif
-#endif
+/*
+ * Type of a machine word. 'unsigned long' would be logical, but that is only
+ * 32 bits on x86_64 Windows. The same applies to 'uint_fast32_t'. So the best
+ * we can do without a bunch of #ifdefs appears to be 'size_t'.
+ */
+typedef size_t machine_word_t;
+
+#define WORDSIZE sizeof(machine_word_t)
+
+#endif /* _WIMLIB_TYPES_H */