1 /* 2 * Private includes and definitions for userspace use of XZ Embedded 3 * 4 * Author: Lasse Collin <lasse.collin@tukaani.org> 5 * 6 * This file has been put into the public domain. 7 * You can do whatever you want with this file. 8 */ 9 10 #ifndef XZ_CONFIG_H 11 #define XZ_CONFIG_H 12 13 /* Uncomment as needed to enable BCJ filter decoders. */ 14 /* #define XZ_DEC_X86 */ 15 /* #define XZ_DEC_POWERPC */ 16 /* #define XZ_DEC_IA64 */ 17 /* #define XZ_DEC_ARM */ 18 /* #define XZ_DEC_ARMTHUMB */ 19 /* #define XZ_DEC_SPARC */ 20 21 #include <stdbool.h> 22 #include <stdlib.h> 23 #include <string.h> 24 25 #include "xz.h" 26 27 #define kmalloc(size, flags) malloc(size) 28 #define kfree(ptr) free(ptr) 29 #define vmalloc(size) malloc(size) 30 #define vfree(ptr) free(ptr) 31 32 #define memeq(a, b, size) (memcmp(a, b, size) == 0) 33 #define memzero(buf, size) memset(buf, 0, size) 34 35 #ifndef min 36 # define min(x, y) ((x) < (y) ? (x) : (y)) 37 #endif 38 #define min_t(type, x, y) min(x, y) 39 40 /* 41 * Some functions have been marked with __always_inline to keep the 42 * performance reasonable even when the compiler is optimizing for 43 * small code size. You may be able to save a few bytes by #defining 44 * __always_inline to plain inline, but don't complain if the code 45 * becomes slow. 46 * 47 * NOTE: System headers on GNU/Linux may #define this macro already, 48 * so if you want to change it, you need to #undef it first. 49 */ 50 #ifndef __always_inline 51 # ifdef __GNUC__ 52 # define __always_inline \ 53 inline __attribute__((__always_inline__)) 54 # else 55 # define __always_inline inline 56 # endif 57 #endif 58 59 /* Inline functions to access unaligned unsigned 32-bit integers */ 60 #ifndef get_unaligned_le32 61 static inline uint32_t get_unaligned_le32(const uint8_t *buf) 62 { 63 return (uint32_t)buf[0] 64 | ((uint32_t)buf[1] << 8) 65 | ((uint32_t)buf[2] << 16) 66 | ((uint32_t)buf[3] << 24); 67 } 68 #endif 69 70 #ifndef get_unaligned_be32 71 static inline uint32_t get_unaligned_be32(const uint8_t *buf) 72 { 73 return (uint32_t)(buf[0] << 24) 74 | ((uint32_t)buf[1] << 16) 75 | ((uint32_t)buf[2] << 8) 76 | (uint32_t)buf[3]; 77 } 78 #endif 79 80 #ifndef put_unaligned_le32 81 static inline void put_unaligned_le32(uint32_t val, uint8_t *buf) 82 { 83 buf[0] = (uint8_t)val; 84 buf[1] = (uint8_t)(val >> 8); 85 buf[2] = (uint8_t)(val >> 16); 86 buf[3] = (uint8_t)(val >> 24); 87 } 88 #endif 89 90 #ifndef put_unaligned_be32 91 static inline void put_unaligned_be32(uint32_t val, uint8_t *buf) 92 { 93 buf[0] = (uint8_t)(val >> 24); 94 buf[1] = (uint8_t)(val >> 16); 95 buf[2] = (uint8_t)(val >> 8); 96 buf[3] = (uint8_t)val; 97 } 98 #endif 99 100 /* 101 * Use get_unaligned_le32() also for aligned access for simplicity. On 102 * little endian systems, #define get_le32(ptr) (*(const uint32_t *)(ptr)) 103 * could save a few bytes in code size. 104 */ 105 #ifndef get_le32 106 # define get_le32 get_unaligned_le32 107 #endif 108 109 #endif 110