1 /* 2 * Private includes and definitions for userspace use of XZ Embedded 3 * 4 * Author: Lasse Collin <lasse.collin (at) 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 to enable CRC64 support. */ 14 /* #define XZ_USE_CRC64 */ 15 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 */ 23 24 /* 25 * MSVC doesn't support modern C but XZ Embedded is mostly C89 26 * so these are enough. 27 */ 28 #ifdef _MSC_VER 29 typedef unsigned char bool; 30 # define true 1 31 # define false 0 32 # define inline __inline 33 #else 34 # include <stdbool.h> 35 #endif 36 37 #include <stdlib.h> 38 #include <string.h> 39 40 #include "xz.h" 41 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) 46 47 #define memeq(a, b, size) (memcmp(a, b, size) == 0) 48 #define memzero(buf, size) memset(buf, 0, size) 49 50 #ifndef min 51 # define min(x, y) ((x) < (y) ? (x) : (y)) 52 #endif 53 #define min_t(type, x, y) min(x, y) 54 55 /* 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 60 * becomes slow. 61 * 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. 64 */ 65 #ifndef __always_inline 66 # ifdef __GNUC__ 67 # define __always_inline \ 68 inline __attribute__((__always_inline__)) 69 # else 70 # define __always_inline inline 71 # endif 72 #endif 73 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) 77 { 78 return (uint32_t)buf[0] 79 | ((uint32_t)buf[1] << 8) 80 | ((uint32_t)buf[2] << 16) 81 | ((uint32_t)buf[3] << 24); 82 } 83 #endif 84 85 #ifndef get_unaligned_be32 86 static inline uint32_t get_unaligned_be32(const uint8_t *buf) 87 { 88 return (uint32_t)(buf[0] << 24) 89 | ((uint32_t)buf[1] << 16) 90 | ((uint32_t)buf[2] << 8) 91 | (uint32_t)buf[3]; 92 } 93 #endif 94 95 #ifndef put_unaligned_le32 96 static inline void put_unaligned_le32(uint32_t val, uint8_t *buf) 97 { 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); 102 } 103 #endif 104 105 #ifndef put_unaligned_be32 106 static inline void put_unaligned_be32(uint32_t val, uint8_t *buf) 107 { 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; 112 } 113 #endif 114 115 /* 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. 119 */ 120 #ifndef get_le32 121 # define get_le32 get_unaligned_le32 122 #endif 123 124 #endif 125