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