2 * Private includes and definitions for userspace use of XZ Embedded
4 * Author: Lasse Collin <lasse.collin@tukaani.org>
6 * This file has been put into the public domain.
7 * You can do whatever you want with this file.
13 /* Uncomment to enable CRC64 support. */
14 /* #define XZ_USE_CRC64 */
16 /* Uncomment as needed to enable BCJ filter decoders. */
17 /* #define XZ_DEC_X86 */
18 /* #define XZ_DEC_POWERPC */
19 /* #define XZ_DEC_IA64 */
20 /* #define XZ_DEC_ARM */
21 /* #define XZ_DEC_ARMTHUMB */
22 /* #define XZ_DEC_SPARC */
25 * MSVC doesn't support modern C but XZ Embedded is mostly C89
26 * so these are enough.
29 typedef unsigned char bool;
32 # define inline __inline
42 #define kmalloc(size, flags) malloc(size)
43 #define kfree(ptr) free(ptr)
44 #define vmalloc(size) malloc(size)
45 #define vfree(ptr) free(ptr)
47 #define memeq(a, b, size) (memcmp(a, b, size) == 0)
48 #define memzero(buf, size) memset(buf, 0, size)
51 # define min(x, y) ((x) < (y) ? (x) : (y))
53 #define min_t(type, x, y) min(x, y)
56 * Some functions have been marked with __always_inline to keep the
57 * performance reasonable even when the compiler is optimizing for
58 * small code size. You may be able to save a few bytes by #defining
59 * __always_inline to plain inline, but don't complain if the code
62 * NOTE: System headers on GNU/Linux may #define this macro already,
63 * so if you want to change it, you need to #undef it first.
65 #ifndef __always_inline
67 # define __always_inline \
68 inline __attribute__((__always_inline__))
70 # define __always_inline inline
74 /* Inline functions to access unaligned unsigned 32-bit integers */
75 #ifndef get_unaligned_le32
76 static inline uint32_t get_unaligned_le32(const uint8_t *buf)
78 return (uint32_t)buf[0]
79 | ((uint32_t)buf[1] << 8)
80 | ((uint32_t)buf[2] << 16)
81 | ((uint32_t)buf[3] << 24);
85 #ifndef get_unaligned_be32
86 static inline uint32_t get_unaligned_be32(const uint8_t *buf)
88 return (uint32_t)(buf[0] << 24)
89 | ((uint32_t)buf[1] << 16)
90 | ((uint32_t)buf[2] << 8)
95 #ifndef put_unaligned_le32
96 static inline void put_unaligned_le32(uint32_t val, uint8_t *buf)
98 buf[0] = (uint8_t)val;
99 buf[1] = (uint8_t)(val >> 8);
100 buf[2] = (uint8_t)(val >> 16);
101 buf[3] = (uint8_t)(val >> 24);
105 #ifndef put_unaligned_be32
106 static inline void put_unaligned_be32(uint32_t val, uint8_t *buf)
108 buf[0] = (uint8_t)(val >> 24);
109 buf[1] = (uint8_t)(val >> 16);
110 buf[2] = (uint8_t)(val >> 8);
111 buf[3] = (uint8_t)val;
116 * Use get_unaligned_le32() also for aligned access for simplicity. On
117 * little endian systems, #define get_le32(ptr) (*(const uint32_t *)(ptr))
118 * could save a few bytes in code size.
121 # define get_le32 get_unaligned_le32