1229159Sadrian/* 2229159Sadrian * Private includes and definitions for userspace use of XZ Embedded 3229159Sadrian * 4229159Sadrian * Author: Lasse Collin <lasse.collin@tukaani.org> 5229159Sadrian * 6229159Sadrian * This file has been put into the public domain. 7229159Sadrian * You can do whatever you want with this file. 8229159Sadrian */ 9229159Sadrian 10229159Sadrian#ifndef XZ_CONFIG_H 11229159Sadrian#define XZ_CONFIG_H 12229159Sadrian 13262764Sdelphij/* Uncomment to enable CRC64 support. */ 14262764Sdelphij/* #define XZ_USE_CRC64 */ 15262764Sdelphij 16229159Sadrian/* Uncomment as needed to enable BCJ filter decoders. */ 17229159Sadrian/* #define XZ_DEC_X86 */ 18229159Sadrian/* #define XZ_DEC_POWERPC */ 19229159Sadrian/* #define XZ_DEC_IA64 */ 20229159Sadrian/* #define XZ_DEC_ARM */ 21229159Sadrian/* #define XZ_DEC_ARMTHUMB */ 22229159Sadrian/* #define XZ_DEC_SPARC */ 23229159Sadrian 24262764Sdelphij/* 25262764Sdelphij * MSVC doesn't support modern C but XZ Embedded is mostly C89 26262764Sdelphij * so these are enough. 27262764Sdelphij */ 28262764Sdelphij#ifdef _MSC_VER 29262764Sdelphijtypedef unsigned char bool; 30262764Sdelphij# define true 1 31262764Sdelphij# define false 0 32262764Sdelphij# define inline __inline 33262764Sdelphij#else 34262764Sdelphij# include <stdbool.h> 35262764Sdelphij#endif 36262764Sdelphij 37229159Sadrian#include <stdlib.h> 38229159Sadrian#include <string.h> 39229159Sadrian 40229159Sadrian#include "xz.h" 41229159Sadrian 42229159Sadrian#define kmalloc(size, flags) malloc(size) 43229159Sadrian#define kfree(ptr) free(ptr) 44229159Sadrian#define vmalloc(size) malloc(size) 45229159Sadrian#define vfree(ptr) free(ptr) 46229159Sadrian 47229159Sadrian#define memeq(a, b, size) (memcmp(a, b, size) == 0) 48229159Sadrian#define memzero(buf, size) memset(buf, 0, size) 49229159Sadrian 50229159Sadrian#ifndef min 51229159Sadrian# define min(x, y) ((x) < (y) ? (x) : (y)) 52229159Sadrian#endif 53229159Sadrian#define min_t(type, x, y) min(x, y) 54229159Sadrian 55229159Sadrian/* 56229159Sadrian * Some functions have been marked with __always_inline to keep the 57229159Sadrian * performance reasonable even when the compiler is optimizing for 58229159Sadrian * small code size. You may be able to save a few bytes by #defining 59229159Sadrian * __always_inline to plain inline, but don't complain if the code 60229159Sadrian * becomes slow. 61229159Sadrian * 62229159Sadrian * NOTE: System headers on GNU/Linux may #define this macro already, 63229159Sadrian * so if you want to change it, you need to #undef it first. 64229159Sadrian */ 65229159Sadrian#ifndef __always_inline 66229159Sadrian# ifdef __GNUC__ 67229159Sadrian# define __always_inline \ 68229159Sadrian inline __attribute__((__always_inline__)) 69229159Sadrian# else 70229159Sadrian# define __always_inline inline 71229159Sadrian# endif 72229159Sadrian#endif 73229159Sadrian 74229159Sadrian/* Inline functions to access unaligned unsigned 32-bit integers */ 75229159Sadrian#ifndef get_unaligned_le32 76229159Sadrianstatic inline uint32_t get_unaligned_le32(const uint8_t *buf) 77229159Sadrian{ 78229159Sadrian return (uint32_t)buf[0] 79229159Sadrian | ((uint32_t)buf[1] << 8) 80229159Sadrian | ((uint32_t)buf[2] << 16) 81229159Sadrian | ((uint32_t)buf[3] << 24); 82229159Sadrian} 83229159Sadrian#endif 84229159Sadrian 85229159Sadrian#ifndef get_unaligned_be32 86229159Sadrianstatic inline uint32_t get_unaligned_be32(const uint8_t *buf) 87229159Sadrian{ 88229159Sadrian return (uint32_t)(buf[0] << 24) 89229159Sadrian | ((uint32_t)buf[1] << 16) 90229159Sadrian | ((uint32_t)buf[2] << 8) 91229159Sadrian | (uint32_t)buf[3]; 92229159Sadrian} 93229159Sadrian#endif 94229159Sadrian 95229159Sadrian#ifndef put_unaligned_le32 96229159Sadrianstatic inline void put_unaligned_le32(uint32_t val, uint8_t *buf) 97229159Sadrian{ 98229159Sadrian buf[0] = (uint8_t)val; 99229159Sadrian buf[1] = (uint8_t)(val >> 8); 100229159Sadrian buf[2] = (uint8_t)(val >> 16); 101229159Sadrian buf[3] = (uint8_t)(val >> 24); 102229159Sadrian} 103229159Sadrian#endif 104229159Sadrian 105229159Sadrian#ifndef put_unaligned_be32 106229159Sadrianstatic inline void put_unaligned_be32(uint32_t val, uint8_t *buf) 107229159Sadrian{ 108229159Sadrian buf[0] = (uint8_t)(val >> 24); 109229159Sadrian buf[1] = (uint8_t)(val >> 16); 110229159Sadrian buf[2] = (uint8_t)(val >> 8); 111229159Sadrian buf[3] = (uint8_t)val; 112229159Sadrian} 113229159Sadrian#endif 114229159Sadrian 115229159Sadrian/* 116229159Sadrian * Use get_unaligned_le32() also for aligned access for simplicity. On 117229159Sadrian * little endian systems, #define get_le32(ptr) (*(const uint32_t *)(ptr)) 118229159Sadrian * could save a few bytes in code size. 119229159Sadrian */ 120229159Sadrian#ifndef get_le32 121229159Sadrian# define get_le32 get_unaligned_le32 122229159Sadrian#endif 123229159Sadrian 124229159Sadrian#endif 125