xref: /freebsd/sys/contrib/xz-embedded/userspace/xz_config.h (revision f0bd5302dd9e20355beadd0f260ffb926b6ac164)
163dab8eeSAdrian Chadd /*
263dab8eeSAdrian Chadd  * Private includes and definitions for userspace use of XZ Embedded
363dab8eeSAdrian Chadd  *
463dab8eeSAdrian Chadd  * Author: Lasse Collin <lasse.collin@tukaani.org>
563dab8eeSAdrian Chadd  *
663dab8eeSAdrian Chadd  * This file has been put into the public domain.
763dab8eeSAdrian Chadd  * You can do whatever you want with this file.
863dab8eeSAdrian Chadd  */
963dab8eeSAdrian Chadd 
1063dab8eeSAdrian Chadd #ifndef XZ_CONFIG_H
1163dab8eeSAdrian Chadd #define XZ_CONFIG_H
1263dab8eeSAdrian Chadd 
13*f0bd5302SXin LI /* Uncomment to enable CRC64 support. */
14*f0bd5302SXin LI /* #define XZ_USE_CRC64 */
15*f0bd5302SXin LI 
1663dab8eeSAdrian Chadd /* Uncomment as needed to enable BCJ filter decoders. */
1763dab8eeSAdrian Chadd /* #define XZ_DEC_X86 */
1863dab8eeSAdrian Chadd /* #define XZ_DEC_POWERPC */
1963dab8eeSAdrian Chadd /* #define XZ_DEC_IA64 */
2063dab8eeSAdrian Chadd /* #define XZ_DEC_ARM */
2163dab8eeSAdrian Chadd /* #define XZ_DEC_ARMTHUMB */
2263dab8eeSAdrian Chadd /* #define XZ_DEC_SPARC */
2363dab8eeSAdrian Chadd 
24*f0bd5302SXin LI /*
25*f0bd5302SXin LI  * MSVC doesn't support modern C but XZ Embedded is mostly C89
26*f0bd5302SXin LI  * so these are enough.
27*f0bd5302SXin LI  */
28*f0bd5302SXin LI #ifdef _MSC_VER
29*f0bd5302SXin LI typedef unsigned char bool;
30*f0bd5302SXin LI #	define true 1
31*f0bd5302SXin LI #	define false 0
32*f0bd5302SXin LI #	define inline __inline
33*f0bd5302SXin LI #else
3463dab8eeSAdrian Chadd #	include <stdbool.h>
35*f0bd5302SXin LI #endif
36*f0bd5302SXin LI 
3763dab8eeSAdrian Chadd #include <stdlib.h>
3863dab8eeSAdrian Chadd #include <string.h>
3963dab8eeSAdrian Chadd 
4063dab8eeSAdrian Chadd #include "xz.h"
4163dab8eeSAdrian Chadd 
4263dab8eeSAdrian Chadd #define kmalloc(size, flags) malloc(size)
4363dab8eeSAdrian Chadd #define kfree(ptr) free(ptr)
4463dab8eeSAdrian Chadd #define vmalloc(size) malloc(size)
4563dab8eeSAdrian Chadd #define vfree(ptr) free(ptr)
4663dab8eeSAdrian Chadd 
4763dab8eeSAdrian Chadd #define memeq(a, b, size) (memcmp(a, b, size) == 0)
4863dab8eeSAdrian Chadd #define memzero(buf, size) memset(buf, 0, size)
4963dab8eeSAdrian Chadd 
5063dab8eeSAdrian Chadd #ifndef min
5163dab8eeSAdrian Chadd #	define min(x, y) ((x) < (y) ? (x) : (y))
5263dab8eeSAdrian Chadd #endif
5363dab8eeSAdrian Chadd #define min_t(type, x, y) min(x, y)
5463dab8eeSAdrian Chadd 
5563dab8eeSAdrian Chadd /*
5663dab8eeSAdrian Chadd  * Some functions have been marked with __always_inline to keep the
5763dab8eeSAdrian Chadd  * performance reasonable even when the compiler is optimizing for
5863dab8eeSAdrian Chadd  * small code size. You may be able to save a few bytes by #defining
5963dab8eeSAdrian Chadd  * __always_inline to plain inline, but don't complain if the code
6063dab8eeSAdrian Chadd  * becomes slow.
6163dab8eeSAdrian Chadd  *
6263dab8eeSAdrian Chadd  * NOTE: System headers on GNU/Linux may #define this macro already,
6363dab8eeSAdrian Chadd  * so if you want to change it, you need to #undef it first.
6463dab8eeSAdrian Chadd  */
6563dab8eeSAdrian Chadd #ifndef __always_inline
6663dab8eeSAdrian Chadd #	ifdef __GNUC__
6763dab8eeSAdrian Chadd #		define __always_inline \
6863dab8eeSAdrian Chadd 			inline __attribute__((__always_inline__))
6963dab8eeSAdrian Chadd #	else
7063dab8eeSAdrian Chadd #		define __always_inline inline
7163dab8eeSAdrian Chadd #	endif
7263dab8eeSAdrian Chadd #endif
7363dab8eeSAdrian Chadd 
7463dab8eeSAdrian Chadd /* Inline functions to access unaligned unsigned 32-bit integers */
7563dab8eeSAdrian Chadd #ifndef get_unaligned_le32
7663dab8eeSAdrian Chadd static inline uint32_t get_unaligned_le32(const uint8_t *buf)
7763dab8eeSAdrian Chadd {
7863dab8eeSAdrian Chadd 	return (uint32_t)buf[0]
7963dab8eeSAdrian Chadd 			| ((uint32_t)buf[1] << 8)
8063dab8eeSAdrian Chadd 			| ((uint32_t)buf[2] << 16)
8163dab8eeSAdrian Chadd 			| ((uint32_t)buf[3] << 24);
8263dab8eeSAdrian Chadd }
8363dab8eeSAdrian Chadd #endif
8463dab8eeSAdrian Chadd 
8563dab8eeSAdrian Chadd #ifndef get_unaligned_be32
8663dab8eeSAdrian Chadd static inline uint32_t get_unaligned_be32(const uint8_t *buf)
8763dab8eeSAdrian Chadd {
8863dab8eeSAdrian Chadd 	return (uint32_t)(buf[0] << 24)
8963dab8eeSAdrian Chadd 			| ((uint32_t)buf[1] << 16)
9063dab8eeSAdrian Chadd 			| ((uint32_t)buf[2] << 8)
9163dab8eeSAdrian Chadd 			| (uint32_t)buf[3];
9263dab8eeSAdrian Chadd }
9363dab8eeSAdrian Chadd #endif
9463dab8eeSAdrian Chadd 
9563dab8eeSAdrian Chadd #ifndef put_unaligned_le32
9663dab8eeSAdrian Chadd static inline void put_unaligned_le32(uint32_t val, uint8_t *buf)
9763dab8eeSAdrian Chadd {
9863dab8eeSAdrian Chadd 	buf[0] = (uint8_t)val;
9963dab8eeSAdrian Chadd 	buf[1] = (uint8_t)(val >> 8);
10063dab8eeSAdrian Chadd 	buf[2] = (uint8_t)(val >> 16);
10163dab8eeSAdrian Chadd 	buf[3] = (uint8_t)(val >> 24);
10263dab8eeSAdrian Chadd }
10363dab8eeSAdrian Chadd #endif
10463dab8eeSAdrian Chadd 
10563dab8eeSAdrian Chadd #ifndef put_unaligned_be32
10663dab8eeSAdrian Chadd static inline void put_unaligned_be32(uint32_t val, uint8_t *buf)
10763dab8eeSAdrian Chadd {
10863dab8eeSAdrian Chadd 	buf[0] = (uint8_t)(val >> 24);
10963dab8eeSAdrian Chadd 	buf[1] = (uint8_t)(val >> 16);
11063dab8eeSAdrian Chadd 	buf[2] = (uint8_t)(val >> 8);
11163dab8eeSAdrian Chadd 	buf[3] = (uint8_t)val;
11263dab8eeSAdrian Chadd }
11363dab8eeSAdrian Chadd #endif
11463dab8eeSAdrian Chadd 
11563dab8eeSAdrian Chadd /*
11663dab8eeSAdrian Chadd  * Use get_unaligned_le32() also for aligned access for simplicity. On
11763dab8eeSAdrian Chadd  * little endian systems, #define get_le32(ptr) (*(const uint32_t *)(ptr))
11863dab8eeSAdrian Chadd  * could save a few bytes in code size.
11963dab8eeSAdrian Chadd  */
12063dab8eeSAdrian Chadd #ifndef get_le32
12163dab8eeSAdrian Chadd #	define get_le32 get_unaligned_le32
12263dab8eeSAdrian Chadd #endif
12363dab8eeSAdrian Chadd 
12463dab8eeSAdrian Chadd #endif
125